如何为子进程注册信号处理程序?

时间:2015-12-03 06:54:06

标签: python linux subprocess signals

添加信号处理程序,例如

#!/usr/bin/python

import subprocess as sp
import signal
import time

def child_handler(sig, frame):
    print("SIGINT child received")

def handler(sig, frame):
    print("SIGINT received")

def preexec():
    print("entering preexec")
    signal.signal(signal.SIGINT, child_handler)
    #signal.signal(signal.SIGINT, signal.SIG_IGN)
    print("leaving preexec")

def signal_sending():
    signal.signal(signal.SIGINT, handler)
    p = sp.check_call(["bash", "process.sh"], preexec_fn=preexec)

if __name__ == "__main__":
    signal_sending()

process.sh

#!/bin/sh

i=0

while [ 1 ]; do
sleep 0.1;
echo $i
i=$((i + 1))
done

无法正常工作,因为 Ctrl C 会中断子流程(仅打印SIGINT received),但SIGINT received和{应该打印{1}}并且孩子继续跑。

添加SIGINT child received会使孩子不受影响,但这还不够,因为我需要为孩子编写自定义处理程序。

我不在乎是否必须使用python 2.7或3.x来实现这一目标。我使用的是Linux 4.3。

1 个答案:

答案 0 :(得分:1)

bash进程替换了分叉的python进程,因此无法运行Python回调。 SIG_IGN适用于SIGINT,因为它可以在exec()电话中幸存下来。

如果您希望在按下 Ctrl + C 时运行某些Python代码;把它放在handler()(父母的信号处理程序)中。或者在bash中捕获相应的信号并对process.sh中的信号运行python子进程。

相关问题