msgrcv funktioniert nicht auf allen Rechnern :(

Post Reply
Message
Author
ThorstenR

msgrcv funktioniert nicht auf allen Rechnern :(

#1 Post by ThorstenR »

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: Select all

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: Select all

...
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 Post by ThorstenR »

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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#3 Post by Janka »

In der Manpage zu msgrecv steht drin:

Code: Select all

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.

Post Reply