Den Tod eines Kindprozesses verfolgen
Wie könnte ich die Spur der Tod eines Kindes verarbeiten, ohne dass der übergeordnete Prozess warten, bis der Kind-Prozess getötet habe?
Ich versuche ein client-server-Szenario der server akzeptiert die Verbindung von einem client und Gabeln, einen neuen Prozess für jede Verbindung akzeptiert.
Ich Ignoriere SIGCHLD-Signale zu verhindern, dass zombie-Kreation.
signal(SIGCHLD, SIG_IGN);
while(1)
{
accept();
clients++;
if(fork() ==0)
{
childfunction();
clients--;
}
else
{
}
}
Das problem in dem oben genannten Szenario ist, dass, wenn der Kind-Prozess wird getötet in der childfunction()
Funktion die Globale variable clients
ist nicht immer erniedrigt.
HINWEIS: ich bin auf der Suche für eine Lösung ohne Verwendung von SIGCHLD-signal ... Wenn möglich
InformationsquelleAutor der Frage codingfreak | 2010-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel schreiben Sie einen handler für
SIGCHLD
fordertwaitpid()
auf pid-1
. Sie können mit der return-Wert aus, um zu bestimmen, welche pid starb. Zum Beispiel:Alternativ können Sie rufen Sie
waitpid(pid, &status, 0)
mit dem Kind, Prozess-ID angegeben wird, und synchron zu warten, für es zu sterben. Oder verwenden SieWNOHANG
um dessen status zu überprüfen, ohne zu blockieren.InformationsquelleAutor der Antwort asveikau
Keiner der Lösungen bisher bieten einen Ansatz ohne Verwendung von SIGCHLD wie die Frage Anfragen. Hier ist eine Implementierung eines alternativen Ansatzes mit Umfrage wie in diese Antwort (was auch erklärt, warum Sie sollten vermeiden Sie die Verwendung von SIGCHLD in Situationen wie dieser):
(Hinweis: ich weggelassen, einige best practices auf, wie Fehler-überprüfung und Reinigung der Datei-Deskriptoren, die für die Kürze)
Ist und hier einige Beispiel-Ausgabe nach der Ausführung des Programms mit der
printf
Aussagen unkommentiert:InformationsquelleAutor der Antwort Michael Harvey
Wollen Sie nicht ein zombie. Wenn ein Kindprozess stirbt und der andere Elternteil ist, noch LÄUFT, aber nie Probleme eine
wait()
/waitpid()
rufen zur Ernte der status, den das system keine Freigabe der Ressourcen für das Kind und eine zombie - /außer Kraft gesetzte Prozess ist Links in der proc-Tabelle.Versuchen Sie Ihr
SIGCHLD
handler, etwas näher auf die folgenden:Könnten Sie Optional Maske/block zusätzliche
SIGCHLD
Signale während der Ausführung der Signalhandler mitsigprocmask()
. Der gesperrte Maske muss wieder auf seinen ursprünglichen Wert zurück, wenn das signal-handling-routine beendet ist.Wenn Sie wirklich nicht wollen, zu einem
SIGCHLD
handler, Sie könnten versuchen, hinzufügen, das Kind verarbeitungsschleife irgendwo, wo es aufgerufen werden würde, regelmäßig und Umfrage für beendet Kinder.InformationsquelleAutor der Antwort jschmier
Die variable 'Kunden' sind in verschiedenen Prozess-Adresse ein Leerzeichen nach dem "fork ()" und wenn Sie verringern Sie die variable in das Kind, das keinen Einfluss auf den Wert in der übergeordneten. Ich glaube, Sie brauchen, um zu behandeln SIGCHLD zu behandeln die richtig zählen.
InformationsquelleAutor der Antwort trojanfoe