stdin und msgrcv blockieren sich gegenseitig
-
Hallo,
ich versuche mich grade daran eine messagequeue zu schreiben (client/server) der server stellt gewisse dienste zur verfügung und der client kann diese in anspruch nehemen. Da sich die anzahl der dienste zur laufzeit ändern kann will ich das ganze so gestallten, das der server den client darüber informiert wenn sich etwas ändert. Das problem ist nun das etweder stdin solange blockiert bis eine eingabe gemacht wurde (in der zeit wird der client nicht aktualisiert) oder msgrcv blockiert d.h. man könnte erst wieder eine eingabe machen wenn eine nachricht eingetroffen ist.
Gibts irgend eine möglichkeit das sich die prozesse nicht blockieren
den code hier#include<stdio.h> #include<curses.h> #include<unistd.h> int kbhit() { struct timeval tv; fd_set fds; tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0 select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); return FD_ISSET(STDIN_FILENO, &fds); } int main() { char c; int i=0; while(!i) { //usleep(10000); i=kbhit(); if (i!=0) { c=fgetc(stdin); if (c=='q') i=1; // else // i=0; } fprintf(stderr,"%d ",i); } printf("\n you hit %c. \n",c); return 0; }
hab ich in den tiefen des internetz gefunden und es immerhin geschafft das stdin nicht mehr blockiert alllerding bleibt das problem mir msgrcv weiterhin bestehen.
any suggestions??grüße
-
Für stdin hast du jetzt eine Art Polling eingerichtet (so lautet der Fachbegriff für den Ansatz ;)) - du prüfst mit kbhit(), ob etwas zu lesen ist, bevor du die (an sich immer noch blockierende) Lesefunktion aufrufst. Etwas analoges solltest du auch für msgrcv() zusammenbauen (eine Funktion, die nur abfragt, ob eine Nachricht auf Abholung wartet).
-
ok
und wie mach ich das ein paar gute quellen währen auch schon ok
-
in der manpage steht was von IPC_NOWAIT
-
hmm,
1. ich glaub ich bin grad zu blöd die man pages zu bedienen
2. hab ich IPC_NOWAIT immer im zusammenhang mit msgsnd gelesen...
3. es scheint zu klappen
4. Danke!