我有一些代码,它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] 不允许操作