2017-01-09 2 views
1

Was ist der Unterschied zwischen Exit-Status und SIGCHLD in Linux?wait() SIGCHLD und der Exit-Status

Nachdem das Kind beendet ist, wird ein SIGCHLD Signal gesendet, um den Eltern zu aktivieren (blockiert durch wait()), also warum brauchen wir einen Exit-Status des Kindes? Ich kann die Verbindung zwischen SIGCHLD und dem Exit-Status nicht finden.

+0

Mögliches Duplikat von [Wie erhält der Elternprozess den Beendigungsstatus durch Warten von einem untergeordneten Prozess, der \ _exit aufruft (http://stackoverflow.com/q/6749475). Siehe auch [Capture exit Statuscode des untergeordneten Prozesses] (http://stackoverflow.com/q/27306764) und [Muss ich etwas mit einem SIGCHLD-Handler tun, wenn ich nur wait() verwende, um auf 1 Kind zu warten fertig zu einer Zeit?] (http://stackoverflow.com/q/18437779) – jww

Antwort

4

Der Beendigungsstatus des untergeordneten Prozesses ist der Wert, der über den Systemaufruf exit() (oder _exit()) an den übergeordneten Prozess zurückgegeben wird. Dies ist eine einfache Ganzzahl, die normalerweise den Erfolg oder das Fehlschlagen des untergeordneten Prozesses angibt, wobei Null (per Konvention) den Erfolg angibt.

SIGCHLD ist ein Signal, das an den übergeordneten Prozess gesendet wird, wenn das Kind beendet wird. Es benachrichtigt den wartenden Elternteil einfach, dass das Kind beendet wurde.

Eine Kombination der beiden wird verwendet, um die Ausführungsergebnisse des untergeordneten Prozesses an den übergeordneten Prozess zu übermitteln. Das Signal teilt dem übergeordneten Element mit, wenn das untergeordnete Element beendet wurde, und der Beendigungsstatus teilt dem übergeordneten Element mit, was die Ausführungsergebnisse des untergeordneten Elements sind. Das übergeordnete Element kann den Beendigungsstatus des Kindes nicht abrufen, bis es ein Signal (oder eine Rückgabe von wait() oder waitpid()) erhält, das angibt, dass das Kind beendet wurde.

Das Kind kann sein Ausführungsergebnis auf verschiedene Weisen an seinen Elternteil zurücksenden (verschiedene IPC-Mechanismen, Datei-I/O usw.), aber die einfachste Art ist die Verwendung von exit() und wait(), um einen Integer-Statuscode von Kind an zu senden Elternteil.

Wenn es dem übergeordneten Prozess egal ist, was der untergeordnete Ausführungsstatus ist, kann er einfach den Beendigungscode des untergeordneten Elements ignorieren, das von wait() zurückgegeben wird. Auf der anderen Seite müssen komplexe Systeme möglicherweise wissen, was der Exit-Status ist, um eine neue Instanz des Kindprozesses erneut zu starten (fork()) oder vielleicht ein anderes Programm auszuführen, wenn der Kindprozess (oder nicht) abgeschlossen wurde seine Aufgabe richtig.

+0

vielen Dank Sir, jetzt verstehe ich die Kombination aus dem Signal und dem Ausgangsstatus. – arctic

3

Der Exit-Status wird von einem Prozess zurückgegeben (über einen Aufruf an 10), um dem übergeordneten System mitzuteilen, ob es erfolgreich war oder nicht.

Wenn der übergeordnete Prozess wait oder waitpid aufruft, erhält er den Exit-Status (und im Fall von waitpid die PID des Kindes) und kann basierend auf diesem Wert Entscheidungen treffen.

Wenn das übergeordnete Objekt ein SIGCHLD-Signal empfängt, wird dem Prozess nur mitgeteilt, dass einer seiner untergeordneten Prozesse beendet ist. Es gibt dem Elternteil keine Informationen über den PID- oder Exit-Status des Kindes. Es ist eine Möglichkeit, dem Elternteil asynchron mitzuteilen, dass es an der Zeit ist, wait oder waitpid anzurufen.

+0

danke, mein Herr, so das Signal gibt die "go" an die Eltern, um den Ausgangsstatus des Kindes über warten zu erhalten. – arctic

Verwandte Themen