如何使用subprocess和preexec_fn处理子SIGFPE / SIGILL信号?

时间:2013-01-23 12:59:39

标签: python signals subprocess

在Linux上我有一个可执行程序,我希望通过Python脚本运行。可执行文件除以零,我似乎无法处理来自子进程的信号。 我四处阅读,似乎preexec_fn应该处理SIGFPE,但到目前为止还没有运气。

我正在使用Python 2.7

我的代码:

# b.py
import os
import subprocess
import signal
import sys

def pref_fun():
    signal.signal(signal.SIGFPE,foo)

def foo(signal,frame):
    print "Caught signal!"
    sys.exit(0)

sub = subprocess.Popen(["a.out"], preexec_fn=pref_fun)
sub.wait()
v = sub.returncode
print "value: ", v

和我的孩子:

a.c
#include <stdio.h>
#include <stdlib.h>
int main() {
    printf("Now dividing by zero\n");
    fflush(stdout);
    double x = 5;
    x= 5/0;
    printf("oh no\n");
    return 0;

}

预期的输出是“抓住信号!”,但我似乎没有得到它。

2 个答案:

答案 0 :(得分:1)

我担心我们不能这样做。虽然信号处理程序安装在分叉子项中,但在./a.out exec()之后,具有信号处理程序的图像被后者替换 - 因此子进程中不再有处理程序。然而,我们可以使用os.WIFSIGNALED(v)检查子进程是否被信号终止,如果为True,我们可以使用os.WTERMSIG(v)来获取它是什么信号,之后,我们可以在父进程中执行某些操作。 / p>

但是,我的机器os.WTERMSIG(v)得到了非常奇怪的结果,发现实际信号数似乎是v的负数(我检查了SIGSEGV和{ {1}}),我不知道这是否是我机器的问题,无论如何,希望这会有所帮助:)。

SIGFPE

输出:

import os
import subprocess
import signal
import sys 

def pref_fun():
    signal.signal(signal.SIGFPE,foo)

def foo(signal,frame):
    print "Caught signal!"
    sys.exit(0)

sub = subprocess.Popen(["./a.out"], preexec_fn=pref_fun)
sub.wait()
v = sub.returncode
print "value: ", v
print os.WIFSIGNALED(v)
print "signal:", os.WTERMSIG(v)
print "SIGFPE", signal.SIGFPE    

答案 1 :(得分:0)

确保使用此配置选项编译Python: --with-fpectl启用SIGFPE捕获