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 🙂


Anmelden zum Antworten