2013-01-23 62 views
3

在Linux上,我有一個我希望通過Python腳本運行的可執行文件。可執行文件除以0,我似乎無法處理來自子進程的信號。 我看了一下,似乎preexec_fn應該處理SIGFPE,但目前還沒有運氣。如何使用子進程和preexec_fn處理子SIGFPE/SIGILL信號?

我使用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; 

} 

預期輸出 「中招的信號!」,但我不似乎得到它。

回答

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 
+0

我觀察到同樣的問題。看起來'os.WTERMSIG(code)'只返回'code'的低7位('os.WTERMSIG(v)'=='v&0x7f')。 – rc0r

0

確保你的Python編譯與此配置選項: --with-fpectl使SIGFPE醒目