msgrcv funktioniert nicht auf allen Rechnern :(

Antworten
Nachricht
Autor
ThorstenR

msgrcv funktioniert nicht auf allen Rechnern :(

#1 Beitrag von ThorstenR » 08. Aug 2007 14:02

Hallo!

Ich habe zwei Programme geschrieben. Das eine wartet auf Daten in einer Message Queue, die das andere Programm in diese sendet.

Auf meinen drei PCs (3x Kubuntu 7.04) funktioniert das alles super.
Auf anderen PCs (1x Debian Etch und 2x Kubuntu 7.04) jedoch steigt das Empfangsprogramm sofort mit der folgenden Meldung aus, sobald eine Nachricht in die Message Queue geschrieben wird:

main: Fehler bei msgrcv: : Invalid argument

Ich kann das nicht nachvollziehen. Problem ist, ich soll das Programm am Freitag vorführen und dann muss es auf fremden Rechnern laufen. :(

Die Code auf der Empfängerseite sieht so aus:

Code: Alles auswählen

struct MainQueue
{
	long int	lMsgType;	/*!< Typ der Nachricht */
	int  		iStatus;	
	char		cFileIN&#91;1024&#93;;	
	int		iCodec;		
	int  		iPackageSize;	
	int  		iPort;		
	char		cIP&#91;255&#93;;	
	int  		iInterval;	
	int		iThreads;	
	long		lOffset;	
&#125; stMainQueue;

...

msqid = msgget&#40;12340815, IPC_CREAT | 0666&#41;;
if &#40; msgrcv&#40;msqid, &#40;struct msgbuf *&#41;&stMainQueue, sizeof&#40;stMainQueue&#41;-sizeof&#40;long int&#41;, 10, 0&#41; == -1&#41;
&#123;
	perror&#40;"main&#58; Fehler bei msgrcv"&#41;; /* Fehler */
	msgctl&#40;msqid, IPC_RMID, NULL&#41;;
	exit&#40;EXIT_FAILURE&#41;;
&#125;
...
Der Code auf der Senderseite:

Code: Alles auswählen

...
msgID = msgget&#40;12340815, IPC_CREAT | 0666&#41;;
msgsnd&#40;msgID, &dataMsg, sizeof&#40;dataMsg&#41;-sizeof&#40;long int&#41;, 0&#41;;
...
Das struct dataMsg ist das gleiche wie oben das stMainQueue.

Wieso funltioniert der Code auf meinen privaten Rechnern, auf anderen aber nicht?
Vor allem kann ich mit "Invalid argument" nicht viel anfangen. :(

Gruß
Thorsten

ThorstenR

#2 Beitrag von ThorstenR » 08. Aug 2007 14:10

NACHTRAG:

Der Fehler tritt wohl nur dann auf, wenn beide Programme als root laufen.
Das Empfangsprogramm muss auf jeden Fall asl root laufen da es Schedulingprioritäten ändert.

Gibt es dafür einen Grund? Also warum darf das die Nachricht sendende Programm nicht als root laufen?

Gruß
Thorsten

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#3 Beitrag von Janka » 08. Aug 2007 21:36

In der Manpage zu msgrecv steht drin:

Code: Alles auswählen

EINVAL     Invalid msqid value, or non-positive mtype value, or invalid msgsz value &#40;less than 0 or greater than the system value MSGMAX&#41;.
Du prüfst den Rückgabewert von msqid aus dem msgget davor nicht. Was macht dich so sicher, dass dieser Aufruf nicht fehlschlägt?

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Antworten