我有一些代码,它fork()调用setsid()孩子,并开始一些处理。如果任何子进程退出(waitpid(-1, 0)),我将杀死所有子进程组:
child_pids = []
for child_func in child_functions:
pid = fork()
if pid == 0:
setsid()
child_func()
exit()
else:
child_pids.append(pid)
waitpid(-1, 0)
for child_pid in child_pids:
try:
killpg(child_pid, SIGTERM)
except OSError as e:
if e.errno != 3: # 3 == no such process
print "Error killing %s: %s" %(child_pid, e)
但是,有时调用killpg会失败并显示“不允许操作”:
杀死 22841 时出错:[Errno 1] 不允许操作
为什么会发生这种情况?
一个完整的工作示例:
从信号导入 SIGTERM
从系统导入退出
从时间导入睡眠
从操作系统导入 *
定义慢():
叉()
睡觉(10)
定义快速():
睡觉(1)
child_pids = []
对于 [快、慢、慢、快] 中的 child_func:
pid = fork()
如果 pid == 0:
设置ID()
child_func()
退出(0)
别的:
child_pids.append(pid)
waitpid(-1, 0)
对于 child_pids 中的 child_pid:
尝试:
killpg(child_pid, SIGTERM)
除了 OSError 为 e:
print "错误杀死 %s: %s" %(child_pid, e)
产生:
$蟒蛇killpg.py 杀死 23293 时出错:[Errno 3] 没有这样的进程 杀死 23296 时出错:[Errno 1] 不允许操作