9

Python から C 実行可能ファイルを実行していますが、この実行可能ファイルは時々セグメンテーション違反を起こします。segfault が発生すると、サブプロセス モジュールは stdout または stderr に何も返しません。

サンプルコード:

import subprocess

proc = subprocess.Popen(['./a.out'], stdin=subprocess.PIPE,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
print 'out: "%s"' % out
print 'err: "%s"' % err
print proc.returncode

のソースa.outは次のとおりです。

int main() {
    printf("hello world\n");
    int x = 1 / 0;
}

の出力./a.outは次のとおりです。

hello world
Floating point exception

Python コードの出力は次のとおりです (Linux では、python 2.7)。

out: ""
err: ""
-8

クラッシュしても実行可能ファイルの出力を取得する方法はありますか?

リターンコードを文字列メッセージに変換する一般的な方法もいいでしょう。

4

2 に答える 2

3

アプリケーションは、ほぼ確実に、セグメンテーション違反が発生する前に出力バッファーをフラッシュしていません。

デフォルトでは、C stdio ライブラリはバッファリングを構成stdoutして、バッファが行末ごとにフラッシュされるようにしますがstdout、tty だけです。そのため、コマンド ラインから実行すると出力が表示されますa.out

これを Python 側から C プログラムに直接変更させることはできません。しかし、できるstdoutことは、その に使用する tty 、つまり疑似 ttyを与えることです。疑似ターミナルを開いて設定する詳細は、通常のパイプを設定するよりもはるかに複雑ですが、役立つモジュールがいくつかあります。特に、Pexpect とこの SO の質問を参照しください

于 2012-05-14T03:06:52.207 に答える
3

C プログラムが出力バッファーをフラッシュしていません。この問題を回避する最も簡単な方法は、STDOUT の出力モードをバッファなしに変更することです。

#include <stdio.h>
int main(int argc,char **argv) {
    setvbuf(stdout,_IONBF,0,0);
    printf("hello world\n");
    int x = 1 / 0;
}

これで、あなたのプログラム (タイプミスを修正するために編集したもの) が正しい出力を生成します。

$ python2.7 x.py
out: "hello world
"
err: ""
0
$

紛らわしいことに、私の Mac のリターン コードは 0 です。これは、シグナルで終了したプログラムにはリターン コードがないためです。

于 2012-05-14T03:14:10.363 に答える