2015-11-03 6 views
6

Ich bin ein bisschen verwirrt. Wie ich es verstehe, bedeutet waitpid mit einer pid von -1, dass ich auf alle Kinder warte, aber wenn ich eine Option zum waitpid von WNOHANG hinzufüge, sagt diese Option, dass sie sofort beendet wird, wenn keine fertig ist ... Das scheint extrem verwirrend.waitpid, wnohang, wuntraced. Wie benutze ich diese

Warum sollte ich dem Computer sagen, dass er warten soll, bis die untergeordneten Prozesse beendet sind und dann sofort danach sagen, dass er sofort beenden soll, wenn kein Kind mehr fertig ist?

Kann jemand diese Option und die WUNTRACED-Optionen erklären? Ich weiß nicht, was es bedeutet, verfolgt zu werden.

+0

pid = -1 bedeutet warten auf * any * Kind, nicht alle von ihnen. Und "wait" ist ein technischer Begriff, der sich auf "wait (2)" bezieht. – melpomene

+0

@melpomene Ah, ja alle und alle sind sehr unterschiedlich. Danke für die Korrektur. Sagen wir, ich habe 3 Kinder ... wie bestimmt der Computer, auf was er warten soll? Oder ist es eine erste Sache, wo, wenn eines der Kinder fertig ist, der Computer technisch gewartet hat und weitergeht? – 8this

+0

@ 8.is Wenn Sie eine PID von "-1" übergeben, wartet es nicht auf * alle * Kinder, um zu beenden, es wartet auf * alle * Kinder, um zu beenden. Sobald ein Kind fertig ist, wird es geerntet. – fuz

Antwort

2

Wenn Sie -1 und WNOHANG übergeben, überprüft waitpid(), ob irgendwelche Zombie-Kinder existieren. Wenn ja, wird einer von ihnen geerntet und ihr Exit-Status zurückgegeben. Wenn nicht, wird entweder 0 zurückgegeben (wenn nicht abgeschlossene untergeordnete Objekte vorhanden sind) oder -1 wird zurückgegeben (falls nicht) und ERRNO ist auf ECHILD festgelegt (keine untergeordneten Prozesse). Dies ist nützlich, wenn Sie herausfinden möchten, ob eines Ihrer Kinder kürzlich gestorben ist, ohne auf einen von ihnen warten zu müssen, um zu sterben. Es ist in dieser Hinsicht ziemlich nützlich.

Die Option WUNTRACED wie unten dokumentiert, ich habe nichts zu dieser Beschreibung hinzufügen:

WUNTRACED   Der Status der untergeordneten Prozesse durch pid angegeben, die gestoppt werden, und deren Status noch nicht berichtet worden seit sie aufgehört haben, sollen sie auch dem anfragenden Prozess gemeldet werden.

Lesen Sie die waitpid Seite von POSIX für weitere Details.

13

Normalerweise verwenden Sie WNOHANG und WUNTRACED in verschiedenen Fällen.

Fall 1: Angenommen, Sie haben einen Prozess, der eine Menge Kinder hervorbringt und andere Dinge erledigen muss, während die Kinder laufen. Diese Kinder verlassen manchmal oder werden getötet, aber der Kernel behält seinen Ausgangsstatus bei, bis ein anderer Prozess ihn über wait() oder waitpid() anfordert. Daher muss Ihr Elternprozess gelegentlich wait()/waitpid() aufrufen, damit sich der Kernel von den Überresten des Kindes befreit. Aber wir wollen nicht warten()/waitpid() auf Block, denn in diesem Fall hat unser Prozess andere Dinge, die es tun muss. Wir wollen nur den Status eines toten Prozesses sammeln wenn gibt es irgendwelche. Dafür ist WNOHANG da. Es verhindert, dass wait()/waitpid() blockiert wird, sodass Ihr Prozess mit anderen Aufgaben fortfahren kann. Wenn ein Kind gestorben ist, wird seine PID von wait()/waitpid() zurückgegeben und Ihr Prozess kann darauf reagieren. Wenn nichts gestorben ist, ist die zurückgegebene PID 0.

Fall 2: Angenommen, Ihr Elternprozess möchte stattdessen nichts tun während Kinder ausgeführt werden. Sie möchten nicht, dass die for-Schleife ein paar Daumen-zu-Dreh-Operationen ausführt, also verwenden Sie eine normale wait()/waitpid() ohne WNOHANG. Ihr Prozess wird aus der Ausführungswarteschlange genommen, bis eines der Kinder stirbt. Aber was, wenn eines Ihrer Kinder über ein SIGSTOP gestoppt ist? Ihr Kind arbeitet nicht mehr an der Aufgabe, für die Sie es festgelegt haben, aber das Elternteil wartet noch. Also, Sie haben eine Sackgasse, in gewissem Sinne, es sei denn, das Kind wird durch irgendwelche Mittel außerhalb Ihrer Eltern und dieses Kind fortgesetzt. WUNTRACED ermöglicht es, dass Ihr Elternteil von wait()/waitpid() zurückgegeben wird, wenn ein Kind gestoppt sowie beendet oder getötet wird. Auf diese Weise haben Ihre Eltern die Möglichkeit, eine SIGCONT zu senden, um sie fortzusetzen, sie zu töten, ihre Aufgaben einem anderen Kind zuzuweisen, was auch immer.