3

Linuxには、Pythonスクリプトを介して実行したい実行可能ファイルがあります。実行可能ファイルがゼロ除算され、サブプロセスからのシグナルを処理できないようです。読んでみると、preexec_fnがSIGFPEを処理するはずですが、今のところ運がありません。

Python2.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;

}

期待される出力は「Caughtsignal!」ですが、うまくいかないようです。

4

2 に答える 2

1

そんなことはできないのではないかと思います。シグナルハンドラーはフォークされた子にインストールされましたが、編集された後./a.outexec()シグナルハンドラーを持つイメージは後者に置き換えられました。したがって、子プロセスにハンドラーはもうありません。それでも、を使用して子プロセスがシグナルによって終了したかどうかを確認できます。Trueのos.WIFSIGNALED(v)場合、それがどのシグナルであったかを取得するために使用できますos.WTERMSIG(v)。その後、親で何かを行うことができます。

しかし、私はos.WTERMSIG(v)自分のマシンで非常に奇妙な結果を得て、実際の信号数が負のように見えることを発見しましたv(私はチェックSIGSEGVしまし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    

出力:

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

Pythonが次のconfigureオプションでコンパイルされていることを確認してください。--with-fpectlenableSIGFPE catching

于 2013-04-18T02:01:18.620 に答える