2016-05-06 9 views
1

Es ist mein Ziel ist es, ein Programm mit einem Elternteil und Kind-Prozess zu machen, und wenn einer sie getötet wird, werden sie ersetzt. Der Teil, mit dem ich zu kämpfen habe, ist der Fall des Todes der Eltern. In diesem Fall muss das Kind zum neuen Elternteil aufsteigen und dann ein eigenes Kind fork(). Wenn ich ein SIGKILL an den Elternprozess sende, scheint mein gesamtes Programm abrupt zu enden, und da ich mit einem SIGKILL nicht umgehen kann, bin ich unsicher, wie ich das richtig machen soll.Ersetzen Eltern Prozess mit Kind-Prozess nach dem Tod

Gibt es eine Möglichkeit, das Kind, um den neuen Eltern-Prozess zu werden am Laufen zu halten?

Dank

+0

Wenn Sie "ersetzt" sagen, meinen Sie, ausgetauscht oder ersetzt durch eins Ein weiterer? – PseudoAj

+0

Das aktuelle Kind (zum Zeitpunkt des Todes des Elternteils) muss ein anderes Kind austeilen und somit zum Elternteil werden und die elterlichen Pflichten des vorherigen Elternteils fortführen. Der neue Parent kann die gleiche PID wie der vorherige Parent haben, oder er kann die PID behalten, die er als Kind hatte. Macht nichts. –

+0

Zur Klarstellung ist der andere Fall, wenn nur das Kind sterben würde. In diesem Fall muss der Elternteil einfach ein neues Kind ausformen.Dieser Teil meines Programms funktioniert ordnungsgemäß. –

Antwort

2

Normalerweise sollte das Kind Sie Folk nicht getötet werden, wenn es sich Eltern getötet, es sei denn, Sie möchten etwas tun: How to make child process die after parent exits?

Wenn die Eltern getötet wird, werden die Kinder ein Kinder der init verarbeiten. Sie haben wahrscheinlich am Terminal gesehen, dass der Prozess unmittelbar nach dem Senden von KILL an die Eltern zurückkehrt. Das liegt daran, dass die Sub-Bash nur auf die PID der Eltern wartet. Aber das Kind läuft eigentlich woanders hin.

Hier ist ein Beispiel, es zu zeigen:

#!/usr/bin/env python 
# test_parent_child_kill.py 
import os 
import time 

def child(): 
    print "Child process with PID= %d"%os.getpid() 
    time.sleep(20) 

def parent(): 
    print "Parent process with PID= %d"%os.getpid() 
    newRef=os.fork() 
    if newRef==0: 
     child() 
    else: 
     print "Parent process and our child process has PID= %d"%newRef 
     time.sleep(20) 

parent() 

Dann im Schlafperiode:

[email protected]:/tmp|⇒ python test_parent_child_kill.py 
Parent process with PID= 17430 
Parent process and our child process has PID= 17431 
Child process with PID= 17431 

[email protected]:/tmp|⇒ kill 17430 

[email protected]:/tmp|⇒ ps -ef | grep 17431 
503 17431  1 0 9:30PM ttys000 0:00.00 /usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python test_parent_child_kill.py 

So das Kind tatsächlich noch am Leben ist.

--Edit--

  1. Warum, wenn die Eltern mein Programm getötet wird beendet mit der Schale zurück?

Bash ruft den Befehl auch über Folk/exec über diese so etwas wie:

childPid = fork(); 
if (childPid == 0){ 
    executeCommand(cmd); //calls execvp 
} else { 
    if (isBackgroundJob(cmd)){ 
     record in list of background jobs 
    } else { 
     waitpid (childPid); 
    }  
} 

Da aus Sicht der bash, die Eltern des Programms ist das Kind, würde es zurückgeben Eingabe aufzufordern, wenn es kommt von waitpid(childPid) zurück.

  1. Gibt es eine Möglichkeit, innerhalb des Programms zu bleiben und weiterhin so zu arbeiten, wie es war, aber mit einem neuen Elternteil?

Es könnte ein bisschen schwierig sein, wenn Sie "re-attach" wollen, aber es ist nicht unmöglich:

Attach to a processes output for viewing

https://unix.stackexchange.com/questions/58550/how-to-view-the-output-of-a-running-process-in-another-bash-session

Referenz:

http://www.cs.cornell.edu/Courses/cs414/2004su/homework/shell/shell.html

Verwandte Themen