2016-08-04 3 views
0

python3では、forked子プロセスを作成していますが、これは正しく終了します。ここではいくつかのコード例は次のとおりです。今python forkを使ってプロセスが消滅するのを避けるには?

import os 

child_pid = os.fork() 
if child_pid == 0: 
    print("I am in the child with PID "+str(os.getpid())) 
    # doing something 
    a = 1+1 
    print("Ending child with PID "+str(os.getpid())) 
    os._exit(0) 
else: 
    #parent process  
    os.waitpid(-1, os.WNOHANG) 
    import time 
    for x in range(100): 
     time.sleep(1) 
     print("waiting...")           

、子プロセスが終了しているように見えるとして、それはまだ「亡き」プロセス(親プロセスがまだ実行されている間)として見ることができます。どのように実際に終了した子プロセスを取り除くのですか?コードを変更するには?

+0

あなたはそれがゾンビプロセスであることを意味するのですか?あなたの親は、それが存在する状態を得るために子供を待つ必要があります、そして、それは遠ざかります。 http://stackoverflow.com/questions/13870945/how-can-i-prevent-a-child-process-to-not-become-a-zombie-if-parent-exits – pcarter

+0

「os._exit(0 ) 'によって' sys.exit(0) 'は状況を変えません。また、親プロセスに 'os.waitpid(-1、os.WNOHANG)'コマンドを追加しても状況は変わりません。 「機能していない」プロセスはまだ存在します! – Alex

+0

@pcarter:私のコマンドを見て、あなたの提案はうまくいかないようです... – Alex

答えて

1

親を待たせたくない場合は、ダブルフォークイディオムを使用できます。基本的な考え方は、(C2)すぐに別の子を作成するために再びフォークしている(C1)子プロセスをforkする(Pそれを呼び出す)親プロセスのためのものであり、その後、終了し

What is the reason for performing a double fork when creating a daemon?を参照してください)。この場合、C2の親が死んでいるので、initプロセスはC2を継承し、あなたのために待機します。あなたはまだPのプロセスでC1を待つ必要がありますか、C1はゾンビになります。ただし、C1は非常に短時間しか実行されないため、Pプロセスは長く待機しません。 C2を実行しているコードは、必要なだけの時間がかかり、Pの前後に終了するかどうかは気にしません。

もう1つのアイデアは、子が終了したときに発生するSIGCHILD信号を処理することです。 〜からhttps://mail.python.org/pipermail/tutor/2003-December/026748.html

import os,signal 

def handleSIGCHLD(): 
    os.waitpid(-1, os.WNOHANG) 

signal.signal(signal.SIGCHLD, handleSIGCHLD) 
+0

興味深いアイデア。後でお試しになります、ありがとう... – Alex

関連する問題