3

我见过几个类似这样的问题,但是在尝试了各种检查孩子是否还活着并退出孩子进程的变体之后,我简化了这个问题,但它仍然不起作用。

使用 sys.exit(0) 退出分叉进程我错了吗?有没有其他方法可以杀死它。问题是,我不能让父进程终止进程,因为它不知道它们何时完成工作。

起初我认为这是因为在退出之前执行了系统命令(Python run system command and then exit... won't exit),但我什至在简化版本中删除了它,因为给定的解决方案也不起作用.

这是一个例子:

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)
for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid

这打印:

Child 27636 spawned
Child 27637 spawned
Child 27638 spawned
Child 27636 is alive
Child 27637 is alive
Child 27638 is alive

但是子进程应该是死的。

在这种情况下,是什么导致这些进程成为僵尸?

4

2 回答 2

5

你必须wait()为子进程。

请添加以下行以纠正错误:

import sys
import os
import time

children = []

for i in range(0,3):    
    pid = os.fork()

    if pid == -1:
        continue
    elif pid == 0:
        # Do work...
        print 'Child %d spawned' % os.getpid()
        sys.exit(0)     
    else:
        children.append(pid)

time.sleep(5)

# ADD NEXT TWO LINES:
for pid in children:
    os.waitpid(pid, 0)

for pid in children:
    proc_path = '/proc/%d' % pid
    if not os.path.exists(proc_path):
        print 'Child %d is dead' % pid
    else:
        print 'Child %d is alive' % pid

父母必须wait()为孩子。详情请参阅man 2 wait

subprocess在 python 中,您可以使用模块处理这些事情。

于 2012-04-13T10:26:42.383 回答
2

为了让孩子从 PID 表中消失,您需要wait()在父母一方。

n_still_children_alive = len(children)
while n_still_children_alive > 0:
    pid, status = os.wait()
    print "Child %d died and joined" % pid
    n_still_children_alive -= 1

如果你想在 Python 中使用多处理,你最好使用multiprocessing模块而不是使用os模块。

于 2012-04-13T10:30:52.587 回答