2013-05-03 14 views
5

Ich habe ein Kind-Prozess, der nur exit(0). Es wurde Zombie. Gibt es Weg, es ohne wait oder waitpid im Elternprozess zu entfernen?Zombie-Prozess entfernen, ohne zu warten C

R+ ./server //parent 
R+ ./server //child 
Z+ (server) //child zombie 
+0

Nicht sicher, wie dies ein C-Post ist. Vielleicht, weil Unix in C erstellt wurde? :) –

+0

Warum willst du nicht 'wait' oder' waitpid' verwenden? – FDinoff

+0

weil 'wait' den Parent-Prozess stoppt, bis zum Child-Exit. –

Antwort

5

Simplest ist SIGCHLD in der Mutter ignoriert zu machen:

signal(SIGCHLD, SIG_IGN); 

Danach werden, ohne dass untergeordnete Prozesse Verlassen nur sauber weggehen werden wartete auf.

Hinweis: Dies ist ein bisschen eine schnelle & dreckige Ansatz und geht davon aus, dass Sie einfach nicht den Exit-Status des untergeordneten Prozesses, oder etwa wenn es beendet. Wenn Sie sich darum kümmern, wie Sie es wahrscheinlich in einer wirklich robusten Anwendung tun sollten, dann sehen Sie sich die andere Antwort an, über das Erstellen einer geeigneten Signal-Handler-Funktion.

Zusatz: Dies ist nicht universell in Unix, funktioniert aber zumindest unter Linux. Laut an UNIX FAQ ist es in POSIX undefiniertes Verhalten. This Mac OS X man page schlägt vor, dass dieses Verhalten in FreeBSD 5.0 ​​eingeführt wurde und unter OS X zum Beispiel funktioniert.

+1

Würden die Kinderprozesse nicht weggehen (ohne Zombies zu sein), nur wenn der Elternprozess beendet wird? Mit anderen Worten, sind sie nicht Zombies, bis der Elternteil geht? Ich könnte mir vorstellen, dass die Eltern sie auch dann "warten" können, wenn sie das "SIGCHLD" -Signal ignorieren, also muss der Kernel den Kinderprozess zombifizieren (aber ich kann falsch liegen, weil ich das nicht getestet habe). –

+0

@BasileStarynkevitch Hinzugefügt einen Absatz und einen Link, der mehr erklärt. Aber wenn es funktioniert, dann geht der beendete/beendete Kinderprozess wirklich einfach weg, kein Zombie, nicht möglich zu warten. – hyde

+0

Geht aber der Kindprozess sofort oder nur dann, wenn der Elternprozess beendet wird? –

6

Sie könnten das SIGCHLD Signal fangen (z sigaction(2) usw. verwendet ...). Seien Sie vorsichtig, nur wenige Funktionen können von einem Signal-Handler sicher aufgerufen werden. Lesen Sie mehrmals signal(7) & signal-safety(7). Eine gute Sache in einem Signal-Handler zu tun ist, nur einige volatile sigatomic_t Flag (die Sie später testen würden, außerhalb der Signal-Handler, zum Beispiel in einigen event loop). Oder Sie könnten zur Initialisierungszeit einen pipe(7) (zu Ihrem eigenen Prozess) einrichten und ein paar Bytes darauf in Ihrem Signal-Handler schreiben (und poll(2) das Leseende woanders), wie suggested by Qt.

Und waitpid(2) kann gesagt werden, nicht mit WNOHANG

zu stoppen Wenn Sie noch nie für Ihr Kind Prozess warten, es zombie werden wird.

Advanced Linux Programming lesen. Es hat ein gutes Kapitel über Prozesse.

2

Sie die doppelte fork Technik verwenden:

ein Prozess Kind Kind erstellen. Und beenden Sie den Kindprozess sofort danach. Auf diese Weise wird der Child-Child-Prozess unter dem init-Prozess ausgeführt. Der Prozess init wartet beim Beenden automatisch auf den Child-Child-Prozess.

Das entfernt waitpid nicht, da das übergeordnete Element das Ende des untergeordneten Prozesses warten muss. Da die Lebensdauer des untergeordneten Prozesses immer minimal ist, können Sie waitpid vom übergeordneten Element ohne lange Blockierung aufrufen.

Weitere Informationen finden Sie unter this article.

Verwandte Themen