Synchronisation mit signalen
-
Halo,
sicherlich kennt jeder das prinzip der synchronisation mit signalen.
(SYNCH_INIT(), HALO_PARENT(), HALO_CHILD(), WAIT_FOR_CHILD(), WAIT_FOR_PARENT()).
Falls nicht, dann kann man dieses konzept zub hier nachlesen:
http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel4a.shtml#4_5
Nun hab ich das Konzept übernommen, mit einem winzigen Unterschied:
Ich habe eine fehlerbehandlung für die Funktionen WAIT_FOR_CHILD() und WAIT_FOR_PARENT() vorgenommen (bei der Funktion sigsuspend()).
Das ganze sieht bei mir nun so aus:void WAIT_FOR_CHILD(void) { while(sig_flag == FALSE){ if(sigsuspend(&sigset_null) == -1) exit(EXIT_FAILURE); } sig_flag = FALSE; if(sigprocmask(SIG_SETMASK, &sigset_old, NULL) == -1) exit(EXIT_FAILURE); }
Wie man sieht hab ich ledeglich eine if-abfrage bei der Funktion sigsuspend() hinzugefügt. Leider Funktioniert durch diesen Zusatz das Ganze nicht mehr.
Ich kann mir das beim besten Willen nicht erklären. Woran liegt das?Gruss
-
Aus man sigsuspend:
RETURN VALUE The functions sigaction, sigprocmask, and sigpending return 0 on success and -1 on error. The function sigsus pend always returns -1, normally with the error EINTR.
-
man: sigsuspend: "The sigsuspend() function always terminates by being interrupted, returning -1 with errno set to EINTR."
(oder auf Deutsch - die Funktion endet IMMER mit dem Rückgabewert -1
-
Vielen Dank,
genau das war das Problem. Merkwürdigerweis steht bei mir: man 2 sigsuspend
[...]
RÜCKGABEWERTE
sigaction, sigprocmask, sigpending und sigsuspend liefern 0 bei Erfolg
und -1 bei aufgetretenen Fehlern.
[...]Naja, zum Glück hab ich da noch mein Buch. Auf dieses ist Verlas.
Gruß und Danke