gpt4 book ai didi

python - 为什么 Python 信号处理程序没有被触发?

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:15 25 4
gpt4 key购买 nike

在下面的代码片段中,我通过调用 signal.signal 注册了信号处理程序。但是,虽然进程在超时后被终止,但处理程序中的 printsystem 语句并未执行。我究竟做错了什么?我在 64 位 Ubuntu 18.04 上运行 Python 2.7.15rc1。

import signal
import time
import os
import multiprocessing as mp

def handler(signal, frame):
print "Alarmed"
os.system('echo Alarmed >> /tmp/log_alarm')

def launch():
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
print "Process launched"
os.execv('/bin/cat', ['cat'])
print "You should not see this"

p = mp.Process(target=launch)
p.start()
print "Process started"
p.join()

最佳答案

此时你已经超出了 Python 的领域。 os.execv() 最终导致execve(2)要进行的系统调用,如其手册页所述:

All process attributes are preserved during an execve(), except the following:

  • The dispositions of any signals that are being caught are reset to the default (signal(7)).

...

这是有道理的,您真的不应该在为它注册旧处理程序的同时运行一些新代码(并且不知道它如何工作,因为处理程序也将被替换)。


如果您在 python 中实现了类似于 cat 的行为,并且没有execve 一个新进程,它会(或多或少)按照您预期的方式工作:

import signal
import time
import os
import sys
import multiprocessing as mp

def handler(signal, frame):
print "Alarmed"
os.system('echo Alarmed >> /tmp/log_alarm')
sys.exit(0)

def launch():
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
print "Process launched"
stdin = os.fdopen(0)
stdout = os.fdopen(1, 'w')
line = stdin.readline()
while line:
stdout.write(line)
line = stdin.readline()
print "You may end here if EOF was reached before being alarmed."

p = mp.Process(target=launch)
p.start()
print "Process started"
p.join()

注意:我只是在子进程中对 stdin/stdout 的处理进行了硬编码。因为你提到了 python 2.7,所以我避免使用 for line in stdin:

关于python - 为什么 Python 信号处理程序没有被触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52461970/

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