waitpid, wnohang, wuntraced. Wie verwende ich diese

Lesezeit: 4 Minuten

Ich bin etwas verwirrt. Wie ich verstehe, bedeutet waitpid mit einer PID von -1, dass ich warte, bis alle Kinder fertig sind, aber wenn ich der waitpid von WNOHANG eine Option hinzufüge, sagt diese Option, dass sie sofort beendet werden soll, wenn keine fertig ist … Dies scheint äußerst verwirrend.

Warum sollte ich dem Computer sagen, dass er warten soll, bis die untergeordneten Prozesse beendet sind, und ihm dann sofort sagen, dass er sofort beendet werden soll, wenn keines der untergeordneten Prozesse beendet ist?

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

  • pid = -1 bedeutet warten irgendein Kind, nicht alle. Und “warten” ist ein Fachbegriff, der sich darauf bezieht wait(2).

    – Melpomen

    3. November 2015 um 21:10 Uhr

  • @melpomene Ah, ja, alle sind sehr unterschiedlich. Danke für die Korrektur. Angenommen, ich habe 3 Kinder … wie bestimmt der Computer, auf welches zu warten ist? Oder ist es so, dass der Computer technisch gesehen gewartet hat und weitermacht, wenn eines der Kinder fertig ist?

    – 8dies

    3. November 2015 um 21:17 Uhr

  • @8this Wenn Sie eine PID von übergeben -1es wartet nicht alle Kinder zu beenden, es wartet irgendein Kind zu beenden. Sobald ein Kind fertig ist, wird es geerntet.

    – fuz

    3. November 2015 um 23:31 Uhr

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

Fall 1: Angenommen, Sie haben einen Prozess, der eine Reihe von Kindern hervorbringt und andere Dinge erledigen muss, während die Kinder laufen. Diese untergeordneten Elemente werden manchmal beendet oder getötet, aber der Kernel behält ihren Beendigungsstatus bei, bis ein anderer Prozess ihn über wait() oder waitpid() beansprucht. Ihr übergeordneter Prozess muss also gelegentlich wait()/waitpid() aufrufen, damit sich der Kernel von den Überresten des untergeordneten Prozesses befreit. Aber wir wollen nicht, dass wait()/waitpid() Block, weil unser Prozess in diesem Fall andere Dinge tun muss. Wir wollen nur den Status eines toten Prozesses erfassen wenn es gibt welche. 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 übergeordneter Prozess möchte dies stattdessen tun nichts während Kinder laufen. Sie möchten nicht, dass es nur eine for-Schleife mit dem Daumen dreht, also verwenden Sie ein normales wait()/waitpid() ohne WNOHANG. Ihr Prozess wird aus der Ausführungswarteschlange genommen, bis eines der Kinder stirbt. Aber was ist, wenn eines Ihrer Kinder es ist? gestoppt über einen SIGSTOP? Ihr Kind arbeitet nicht mehr an der Aufgabe, die Sie ihm gestellt haben, aber die Eltern warten noch. Sie haben also gewissermaßen eine Sackgasse, es sei denn, das Kind wird auf irgendeine Weise außerhalb Ihres Elternteils und dieses Kindes fortgesetzt. WUNTRACED ermöglicht es Ihrem Elternteil, von wait()/waitpid() zurückgegeben zu werden, wenn ein Kind bekommt gestoppt sowie verlassen oder getötet werden. Auf diese Weise haben Ihre Eltern die Möglichkeit, ihm ein SIGCONT zu senden, um es fortzusetzen, es zu töten, seine Aufgaben einem anderen Kind zuzuweisen, was auch immer.

  • Legendär erklären!

    – Benni

    2. Juni 2020 um 21:00 Uhr

  • also informiert wait() oder waitpid() standardmäßig nicht den Elternprozess, wenn ein Kind durch ein Signal gestoppt wird? Weil die Dokumentation sagt “setzt die Ausführung des aufrufenden Threads aus, bis eines seiner Kinder beendet wird”. . Daher ist mir nicht klar, ob “terminiert” an einem Signal liegen könnte

    – tonythestark

    7. April 2021 um 10:19 Uhr


  • Ah, die Begriffe sind nicht sehr klar … meine Schuld. „Beendet“ bedeutet, dass der Prozess abgeschlossen ist (oder aufgrund eines Fehlers abgestürzt ist oder durch ein SIGKILL beendet wurde) und dass ein Exit-Code verfügbar ist, den der Elternprozess untersuchen kann. Wo ich oben “angehalten” verwendet habe, hätte ich eigentlich “angehalten” oder “angehalten” sagen sollen (aber das Signal dafür ist ein “SIGSTOP”, weshalb ich schlampig wurde, als ich sagte “angehalten”). Angehaltene Prozesse (z. B. wenn Sie Strg-z in einer Shell verwenden) können später fortgesetzt werden. So, irgendein Wenn ein Prozess beendet wird (über exit(val), ein SIGKILL, ein Segfault), sollte ein wait() fortgesetzt werden können.

    – Jemenake

    8. April 2021 um 20:49 Uhr

Wenn Sie bestehen -1 und WNOHANG, waitpid() überprüft, ob Zombie-Kinder existieren. Wenn ja, wird einer von ihnen geerntet und sein Exit-Status zurückgegeben. Wenn nicht, auch nicht 0 zurückgegeben wird (falls nicht abgeschlossene Kinder vorhanden sind) oder -1 zurückgegeben wird (wenn nicht) und ERRNO ist eingestellt auf ECHILD (Keine untergeordneten Prozesse). Dies ist nützlich, wenn Sie herausfinden möchten, ob eines Ihrer Kinder kürzlich gestorben ist, ohne auf den Tod eines von ihnen warten zu müssen. Es ist in dieser Hinsicht ziemlich nützlich.

Die Option WUNTRACED wie folgt dokumentiert ist, habe ich dieser Beschreibung nichts hinzuzufügen:

WUNTRACEDDer Status aller durch pid angegebenen untergeordneten Prozesse, die gestoppt wurden und deren Status noch nicht gemeldet wurde, seit sie gestoppt wurden, soll ebenfalls dem anfordernden Prozess gemeldet werden.

Lies das wartenpid Seite von Posix für mehr Details.

1383940cookie-checkwaitpid, wnohang, wuntraced. Wie verwende ich diese

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy