您的
sisr
处理程序从未执行。
signal.setitimer(signal.ITIMER_VIRTUAL, 1, 1)
这行代码设置了一个虚拟定时器,根据文档,它只有在进程执行时才会减少间隔计时器,并在到期时发送SIGVTALRM信号。问题是,你的进程几乎从不执行。打印操作在进程内几乎不消耗时间,所有工作都由内核将输出传递给控制台应用程序(xterm、konsole等)和应用程序重绘屏幕完成。同时,你的子进程处于睡眠状态,计时器不会运行。使用真正的计时器进行更改,它就可以正常工作 :)
import signal
import os
from time import sleep
def isr(signum, frame):
print "Hey, I'm the ISR!"
signal.signal(signal.SIGALRM, isr)
pid = os.fork()
if pid == 0:
def sisr(signum, frame):
print "Child running sisr"
os.kill(os.getppid(), signal.SIGALRM)
signal.signal(signal.SIGALRM, sisr)
signal.setitimer(signal.ITIMER_REAL, 1, 1)
while True:
print "2"
sleep(1)
else:
sleep(10)
print "Parent quitting"
输出:
spectras@etherbee:~/temp$ python test.py
2
Child running sisr
2
Hey, I'm the ISR!
Parent quitting
spectras@etherbee:~/temp$ Child running sisr
Traceback (most recent call last):
File "test.py", line 22, in <module>
sleep(1)
File "test.py", line 15, in sisr
os.kill(os.getppid(), signal.SIGALRM)
OSError: [Errno 1] Operation not permitted
注意: 当子进程第二次运行sisr
时,程序会崩溃。这是因为父进程已经退出,使得os.getppid()
返回值为0
,向进程0发送信号是不被允许的。