• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Problem: Signal SIGCHLD abfangen

deetee

Newbie
Hallo,

ich habe ein Problem mit dem Abfangen von dem Signal SIGCHLD, das ausgelöst wird, wenn sich ein Kindprozess beendet.

Ich habe gelesen, dass das Signal "normalerweise ignoriert wird". Steht zumidnest hier:
http://linuxreviews.org/man/signal/index.html.de

Ok, dann muss man wohl dieses Signal stets "freigeben", oder?
Zumindest hab ich das Problem, dass es ohne meinem Versuch das Signal freizugeben nicht klappt, aber auch mein Freigeben scheint falsch zu sein.

Ich möchte also das Singal SIGCHLD per Signalhandler Funktion abfangen. Aber die Funktion wird nicht ausgeführt, obwohl ich den Kindprozess per exit(0) beende. Dieser wandert in der Prozesstabelle dann als Zombie herum.

Übrigens funktioniert der Signalhandler, wenn ich SIGINT abfange.

Code:
void init_signal_handler(int signal)
{
    struct sigaction sa;
    sigset_t sigmask;

    Sigemptyset(&sigmask);
    Sigaddset(&sigmask, SIGCHLD);
    Sigprocmask(SIG_UNBLOCK, &sigmask, NULL);

    memset(&sa, 0, sizeof(sa));
    sa.sa_handler     = sig_child_handler;
    sa.sa_mask        = sigmask;
    Sigaction(signal, &sa, NULL);
}
 
Code:
static void initialize_sighandler(void) {
    struct sigaction sa;
    sa.sa_handler = sigchld_handler;
    sa.sa_flags = SA_RESTART;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGCHLD, &sa, NULL);
    return;
}
Und wie is hiermit?
 
OP
D

deetee

Newbie
ok, ichhab das Problem ausgemacht. Ich hab ein accept() nachdem ich den Kindprozess überlager. Und da der Prozess natürlich nicht in jedem Fall vor dem accept() sich beendet, wird accept() aufgerufen (blockiert) und das Signal dann anscheinend ignoriert.

Hat auch was mit der Zufälligkeit des Schedulers zu tun. Aber kann das sein, dass das Signal SIGCHLD ignoriert wird, nur weil eine Funktion blockiert?
 
Signale unterbrechen den eigentlichen Funktionslauf von accept(), führen dann den Signal-Handler aus und kehren stillschweigend nach accept() zurück. Es sei denn, du verwendest non-blocking I/O, dann gibt's -1 und errno=EINTR für accept.
 
OP
D

deetee

Newbie
jup, das hab ich mittlerweile auch rausgefunden, was nämlich auch mein neuestes Problem erklärt. (anderer thread)

Du meinst doch mit non-blocking I/O sowas wie das hier:
sa.sa_flags = SA_NOCLDSTOP;
oder?
 
Oben