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.
pid = -1 bedeutet warten auf * any * Kind, nicht alle von ihnen. Und "wait" ist ein technischer Begriff, der sich auf "wait (2)" bezieht. – melpomene
@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
@ 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