gpt4 book ai didi

Python:忽略后台进程中的信号

转载 作者:行者123 更新时间:2023-11-28 16:39:00 25 4
gpt4 key购买 nike

我正在创建一个定期调用外部命令的 Python 程序。外部命令需要一些秒完成。我想减少外部命令终止的可能性通过为 SIGINT 添加信号处理程序很糟糕。基本上,我希望 SIGINT 尝试等到命令在终止 Python 程序之前执行。问题是外部的 perogram 似乎是也获得 SIGINT,导致它突然结束。我正在使用外部线程调用命令,因为根据 http://docs.python.org/2/library/signal.html,信号的 Python 文档提到只有主线程接收信号.有人可以帮忙吗?这是我的代码的 stub 。假设外部程序是/bin/sleep:

import sys
import time
import threading
import signal
def sleep():
import subprocess
global sleeping
cmd = ['/bin/sleep', '10000']
sleeping = True
p = subprocess.Popen(cmd)
p.wait()
sleeping = False

def sigint_handler(signum, frame):
if sleeping:
print 'busy, will terminate shortly'
while(sleeping): time.sleep(0.5)
sys.exit(0)
else:
print 'clean exit'
sys.exit(0)

sleeping = False
signal.signal(signal.SIGINT, sigint_handler)
while(1):
t1 = threading.Thread(target=sleep)
t1.start()
time.sleep(500)

预期的行为是在程序启动后按 Ctrl+C N 秒将导致它等待 (10000 - N) 秒然后退出。发生的事情是程序立即终止。

谢谢!

最佳答案

问题是在执行新进程时修改信号处理程序的方式。来自 POSIX:

A child created via fork(2) inherits a copy of its parent's signal dis‐
positions. During an execve(2), the dispositions of handled signals
are reset to the default; the dispositions of ignored signals are left
unchanged.

所以你需要做的是:

  1. 忽略SIGINT信号
  2. 启动外部程序
  3. 根据需要设置 SIGINT 处理程序

这样,外部程序将忽略 SIGINT。

当然,当您的脚本不会响应 SIGINT 时,这会留下一个(非常)小的时间窗口。但这是您必须忍受的事情。

例如:

sleeping = False
while(1):
t1 = threading.Thread(target=sleep)
signal.signal(signal.SIGINT, signal.SIG_IGN)
t1.start()
signal.signal(signal.SIGINT, sigint_handler)
time.sleep(500)

关于Python:忽略后台进程中的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002521/

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