Signalbehandlung



  • Hallo,

    ich habe mal ne Frage zur Signalbehandlung. Ich möchte das SIGCHLD signal der Kindprozesse ingnorieren. Mein Initialisierung meiner sigaction sieht so aus:

    [cpp]
    struct sigaction action;
    sigemptyset(&action.sa_mask);
    action.sa_flags = SA_NOCLDWAIT;
    action.sa_handler = SIG_DFL;
    sigaction(SIGCHLD, &action, NULL);
    
    if(fork() == 0){
        //execute
    }
    [/cpp]
    

    Muss ich wenn ich meine Signalhandler so initialisiere noch etwas machen? Oder
    muss ich das Signal SIGCHLD noch manuell blockieren und entblockieren?
    mit:

    [cpp]
    sigset_t set, old_set;
    sigemptyset(&set);
    sigaddset(&set, SIGCHLD);
    sigprocmask(SIG_BLOCK, &set, &old_set);
    [/cpp]
    

    und danach wieder freigeben mit SIG_UNBLOCK.

    Wenn ja, dann gleich meine nächste Frage: Wann und wo muss ich das Signal wieder freigeben? Im Elternprozess?

    Danke im voraus!



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hab etzt noch mal ein wenig in die Signalbehandlung eingelesen. Und anscheinden muss man die Signale nur manuell blockieren und deblockieren, wenn es zu Nebenläufigkeitsproblemen kommt !?
    Noch jemand eine Meinung zu dem Thema?



  • Nebenläufigkeitsprobleme löst man in der Regel mit Semaphoren.

    Mit Signalhandlern kann man dagegen unerwünschte Unterbrechungen
    wir CTRL-C abblocken.

    Der Parameter SIG_UNBLOCK macht keinesfalls SIG_BLOCK rückgängig.

    Besser wäre die in old_set gesicherte Maske wieder herzustellen.

    sigprocmask(SIG_BLOCK, &set, &old_set);

    sigprocmask(SIG_SETMASK, &old_set, NULL);

    Habe in Bezug auf Nebenläufigkeiten im "Linux Programmer's Manual" noch folgenden Hinweis gefunden:

    The use of sigprocmask() is unspecified in a multithreaded process;
    see pthread_sigmask(3).


Anmelden zum Antworten