gpt4 book ai didi

python - SIGINT 如何传递给孙子(以及如何以编程方式执行此操作)

转载 作者:太空狗 更新时间:2023-10-29 12:31:27 24 4
gpt4 key购买 nike

使用 linux/bash/python3,我创建了一个孙进程 sleep 123。当我调用 p.terminate() 时,这会终止子进程(init 接管孙进程 sleep 123)。但是,在 python 解释器中,我仍然可以按 Ctrl+C 来杀死孙子。

我的问题是 1) python 解释器如何在现在由 init 作为父级时将 SIGINT 发送给孙子,以及 2) 我如何以编程方式杀死孙子。我试过 p.send_signal(signal.SIGINT),使用 stdin=PIPE 等,但无法让它工作。

gnr@localhost: python3
Python 3.3.1
>>> from subprocess import PIPE, Popen
>>> p = Popen(['bash', '-c', '(sleep 123)'])

gnr@localhost: ps -AF | grep sleep
gnr 5081 5078 0 26526 1168 6 14:03 pts/26 00:00:00 bash -c (sleep 123)
gnr 5082 5081 0 25228 564 4 14:03 pts/26 00:00:00 sleep 123

>>> p.terminate()

gnr@localhost: ps -AF | grep sleep
gnr 5082 1 0 25228 564 4 14:03 pts/26 00:00:00 sleep 123 #init inherits

>>> # hits Ctrl+C
KeyboardInterrupt
>>>

gnr@localhost: ps -AF | grep sleep
#grandchild is dead

更新:我最终使用了 pexpect(它为您处理了很多 pty 和 termios 的东西)。

最佳答案

孙子仍然将终端作为其标准输入,无论是否重新设置父级,因此在终端中按 Ctrl-C 会向它发送一个 SIGINT。自己动手,需要知道孙子的PID。没有简单的方法来获得它;你的子进程可能已经产生了十几个自己的 child ,他们可能已经产生了更多的 child ,等等。根本不清楚哪个是“孙子”

然而,您可以向前台组中的所有进程发送信号。

os.kill(-os.getpgid(os.getpid()),signal.SIGINT)

当然,这只有在 Python 本身连接到终端时才有效。

关于python - SIGINT 如何传递给孙子(以及如何以编程方式执行此操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25794482/

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