Ich habe das verstanden: 1) waitpid wird verwendet, um auf den Tod eines Kindes zu warten und dann die SIGCHLD und den Austrittsstatus des Kindes usw. zu sammeln. 2) Wenn wir einen Signal-Handler für SIGCHLD haben, machen wir noch ein paar Dinge, die mit der Säuberung von Kind- oder anderem Zeug zu tun haben (bis zum Programmierer) und machen dann eine Wartepause, damit das Kind nicht Zombie geht und dann zurückkehrt.
Nun, müssen wir in unseren Programmen sowohl 1 als auch 2 haben, wenn wir einen fork / exec machen und das Kind zurückkehrt? Wenn wir beide haben, wird der SIGCHLD zuerst erhalten, so dass der Signalhandler zuerst aufgerufen wird und somit sein waitpid erfolgreich aufgerufen wird und nicht der waitpid im übergeordneten Prozesscode wie folgt:
%Vor%Schätzen Sie, wenn mir jemand hilft, dies zu verstehen.
Ich habe das verstanden: 1) waitpid wird verwendet, um auf den Tod eines Kindes zu warten und dann die SIGCHLD und den Austrittsstatus des Kindes usw. zu sammeln. 2) Wenn wir einen Signal-Handler für SIGCHLD haben, machen wir noch ein paar Dinge, die mit der Säuberung von Kind- oder anderem Zeug zu tun haben (bis zum Programmierer) und machen dann eine Wartepause, damit das Kind nicht Zombie geht und dann zurückkehrt.
Nun, müssen wir in unseren Programmen sowohl 1 als auch 2 haben, wenn wir einen fork / exec machen und das Kind zurückkehrt? Wenn wir beide haben, wird der SIGCHLD zuerst erhalten, so dass der Signalhandler zuerst aufgerufen wird und somit sein waitpid erfolgreich aufgerufen wird und nicht der waitpid im übergeordneten Prozesscode wie folgt:
%Vor%Schätzen Sie, wenn mir jemand hilft, dies zu verstehen.
Sie müssen die wartenden Syscalls wie waitpid oder Freunde anrufen - zB SIGCHLD
, wie auch immer Sie könnten habe Zombie-Prozesse .
Sie könnten mit waitpid
umgehen, um benachrichtigt zu werden, dass ein Kind beendet wurde (oder gestoppt wurde, usw.), aber Sie müssen später darauf warten.
Signalhandler können nur eine kleine Menge von async-signalsicheren Funktionen aufrufen (siehe Signal (7) für mehr). Guter Rat ist, einfach eine SIGCHLD
-Flagge zu setzen und sie an späteren und sichereren Orten zu testen.
Sie müssen die wartenden Syscalls wie waitpid oder Freunde anrufen - zB wait4
, wie auch immer Sie könnten habe Zombie-Prozesse .
Sie könnten mit SIGCHLD
umgehen, um benachrichtigt zu werden, dass ein Kind beendet wurde (oder gestoppt wurde, usw.), aber Sie müssen später darauf warten.
Signalhandler können nur eine kleine Menge von async-signalsicheren Funktionen aufrufen (siehe Signal (7) für mehr). Guter Rat ist, einfach eine volatile sig_atomic_t
-Flagge zu setzen und sie an späteren und sichereren Orten zu testen.
Tags und Links c linux operating-system