在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;
}
预期的输出是“抓住信号!”,但我似乎没有得到它。
答案 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捕获