2012-03-23 7 views
3

Wenn in Unix ein untergeordneter Prozess im Hintergrund beendet wird, sendet es ein SIGCHLD Signal an das übergeordnete Element, um es darüber zu informieren, dass es beendet wurde.SIGCHLD Signalverarbeitung

Findet dasselbe auch statt, wenn der Prozess im Vordergrund stand? Wenn dies der Fall ist, bedeutet dies, dass der Elternteil sie einfach ignorieren wird.

Ist das richtig? Oder wenn es im Vordergrund ist, wird überhaupt kein Signal gesendet?

+1

Ja, SIGCHLD wird auch für Vordergrundprozesse gesendet, glaube ich. Sie könnten mit strace überprüfen. –

+0

Haben Sie es versucht? –

Antwort

9

Hintergrund und Vordergrund sind Jobsteuerungskonzepte und sind Teil der Shell. Sie werden auf Prozesse angewendet und beeinflussen nicht, welcher Prozess einen anderen Prozess hervorgebracht (ausgeführt) hat.

Ein untergeordneter Prozess ist das Ergebnis eines Aufrufs von fork() - exec(). Das Kind erhält eine Eltern-PID des Prozesses, der den Aufruf fork() ausgeführt hat. Dies ist der Kontext des SIGCHLD-Signals, das Eltern-PID empfängt das SIGCHLD-Signal. Es spielt keine Rolle, ob der untergeordnete Prozess "Vordergrund" oder "Hintergrund" ist, nur der Ablauf ist wichtig beim Beenden des Prozesses.

+0

Wann genau sendet der Elternteil ein 'SIGCHLD'signal? In dem Code, den ich schreibe, scheint es, es sendet es, sobald es beginnt, was falsch scheint. – darksky

+0

Das exektable tut es als Teil des Prozessablaufs - der Teil, wo es offene Dateideskriptoren usw. während Ihres Prozesses schließt wird heruntergefahren. Es gibt (abhängig von der Implementierung) eine Datei crt0.o (kann andere Namen haben), die in jedes ausführbare Bild eingebunden ist. Es hat einige Einstiegspunkte wie _start(), _cleanup() usw. Diese werden aufgerufen, nachdem Ihr main() zurückgibt oder der Prozess _exit() oder exit() aufruft. _start() ruft main() auf, BTW. Wie auch immer, dieser Code sendet das Signal an die Eltern. –

+0

@jimmcnamara: 'SIGCHLD' wird vom Kernel gesendet. – ninjalj

2

Es gibt keine so wie Vordergrund Kind. Der Begriff Hintergrundprozess wird verwendet, um einfach darauf hinzuweisen, dass es sich hauptsächlich um den Elternprozess handelt (der untergeordnete Prozesse erzeugen kann, um einen Teil seiner Arbeit zu erledigen). Wenn ein untergeordneter Prozess beendet wird, wird SIGCHLD immer an den übergeordneten Prozess gesendet. Der übergeordnete Prozess ignoriert es jedoch normalerweise. Wenn sich der Elternteil mit dem Beenden des Kindes befassen oder nur nach dem Beenden des Kindes eine Aktion ausführen möchte, kann er den Systemaufruf wait() verwenden, um den Status des untergeordneten Prozesses zu erhalten.

Verwandte Themen