2016-08-04 62 views
0

在python3中,我正在創建分叉的子進程,我退出 - 我認爲 - 正確。下面是一些代碼示例:如何避免使用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

通過defunct是否意味着這是一個殭屍進程?你的父母需要等待孩子獲得它的存在狀態,然後它會消失。請參閱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 )''by'sys.exit(0)'不會改變這種情況。並且在父進程中添加命令'os.waitpid(-1,os.WNOHANG)'不會改變這種情況。一個'不存在'的過程依然存在! – Alex

+0

@pcarter:看到我的命令,你的建議似乎不起作用... – Alex

回答

1

如果您不希望父母等待,則可以使用雙叉成語。 (見What is the reason for performing a double fork when creating a daemon?

的基本思想是父進程(稱之爲P)到餐桌一個孩子(C1)立即叉再創造另一個孩子(C2),然後退出。在這種情況下,由於C2的父項已經死亡,因此init進程將繼承C2,並等待它。您仍然需要等待P進程中的C1C1將成爲殭屍。然而,C1只運行很短的時間,所以P進程不會等待很長時間。運行C2的代碼然後可以根據需要花費盡可能多的時間,並且不在乎它是否在P之前或之後完成。

另一個想法是處理孩子退出時發生的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