gpt4 book ai didi

python - 当所有权正确时,为什么 `killpg` 会返回 “not permitted”?

转载 作者:太空狗 更新时间:2023-10-29 20:50:21 27 4
gpt4 key购买 nike

我有一些代码可以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 会失败并显示“不允许操作”:

Error killing 22841: [Errno 1] Operation not permitted

为什么会这样?

一个完整的工作示例:

from signal import SIGTERMfrom sys import exitfrom time import sleepfrom os import *def slow():    fork()    sleep(10)def fast():    sleep(1)child_pids = []for child_func in [fast, slow, slow, fast]:    pid = fork()    if pid == 0:        setsid()        child_func()        exit(0)    else:        child_pids.append(pid)waitpid(-1, 0)for child_pid in child_pids:    try:        killpg(child_pid, SIGTERM)    except OSError as e:        print "Error killing %s: %s" %(child_pid, e)

产生:

$ python killpg.pyError killing 23293: [Errno 3] No such processError killing 23296: [Errno 1] Operation not permitted

最佳答案

我也添加了一些调试 ( slightly modified source )。当你试图杀死一个已经退出并处于僵尸状态的进程组时,就会发生这种情况。哦,只需使用 [fast, fast] 即可轻松重复。

$ python so.py 
spawned pgrp 6035
spawned pgrp 6036
Reaped pid: 6036, status: 0
6035 6034 6035 Z (Python)
6034 521 6034 S+ python so.py
6037 6034 6034 S+ sh -c ps -e -o pid,ppid,pgid,state,command | grep -i python
6039 6037 6034 R+ grep -i python

killing pg 6035
Error killing 6035: [Errno 1] Operation not permitted
6035 6034 6035 Z (Python)
6034 521 6034 S+ python so.py
6040 6034 6034 S+ sh -c ps -e -o pid,ppid,pgid,state,command | grep -i python
6042 6040 6034 S+ grep -i python

killing pg 6036
Error killing 6036: [Errno 3] No such process

不确定如何处理。也许您可以将 waitpid 放在一个 while 循环中以获取所有终止的子进程,然后继续 pgkill()ing 其余部分。

但是您的问题的答案是您获得了 EPERM,因为您不允许 killpg 僵尸进程组组长(至少在 Mac OS 上)。

此外,这在 python 之外是可验证的。如果你在那里 sleep ,找到其中一个僵尸的 pgrp,并试图杀死它的进程组,你也会得到 EPERM:

$ kill -TERM -6115
-bash: kill: (-6115) - Operation not permitted

确认这在 Linux 上也不会发生。

关于python - 当所有权正确时,为什么 `killpg` 会返回 “not permitted”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521705/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com