3

在 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;

}

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

4

2 回答 2

1

恐怕我们不能这样做。虽然信号处理程序安装在分叉子进程中,但在./a.outexec()ed 后,具有信号处理程序的图像被后者替换 - 因此子进程中不再有处理程序。但是我们可以通过使用来检查子进程是否被信号终止os.WIFSIGNALED(v),如果为True,我们可以使用os.WTERMSIG(v)来获取它是哪个信号,之后我们可以在父进程中做一些事情。

但是,我在我的机器上得到了非常奇怪的结果os.WTERMSIG(v),发现真实的信号数似乎是负数v(我检查了SIGSEGVSIGFPE),我不知道是不是我的机器的问题,无论如何,希望这个帮助:)。

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    

输出:

Now dividing by zero
value:  -8
True
signal: 120
SIGFPE 8
于 2013-01-23T15:59:40.767 回答
0

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

于 2013-04-18T02:01:18.620 回答