1

コンソール プログラムを実行し、その出力を「out」ファイルと「err」ファイルに送信し、「in」ファイルから入力を取得できる簡単なデバッガ プログラムを作成しました。ここで、その機能を拡張して Python スクリプトを実行したいと考えています。これを行うには、デバッガーで Python インタープリターを実行し、Python インタープリターとファイルをやり取りするだけでよいと考えています。

しかし、Python インタープリターをデバッガーで実行すると、通常のプログラムのように出力が表示されません。デバッガーには非常に詳細なエラー ログがあり、エラー ログ ファイルにエラーはありません。

私は "ps -A" を使用しましたが、デバッガーが Python インタープリターを開始したように見えるのは、次の 2 つの理由からです。ファイル記述子が接続されていることを伝えます)。ps -All の出力は次のとおりです。

1 R     0  1565     1 88  80   0 -  1040 -      pts/0    00:01:45 debugger
0 S     0  1566  1565  0  80   0 -  7782 pipe_w pts/0    00:00:00 python.out

そして、デバッガーは次のように開始されます ( python.out は python インタープリターのコピーです):

debugger python.out

私の質問は、なぜこれが機能しないのか誰か知っていますか? Python インタープリターは、標準のファイル記述子に対して奇妙なことをしますか?

編集:

  • また、python.out が python.out > out_file を使用して IO をリダイレクトできないことにも気付きました。これは、デバッガーが抱えている問題に関連している場合と関連していない場合があります。

  • デバッガーはブロック バッファリングを使用しません。

  • /proc/pid/io からの io 情報は次のとおりです。

デバッガー (長さ 21 のデータを「in」ファイルに書き込みました)

rchar: 21
wchar: 21
syscr: 300222462
syscw: 1
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

Python インタープリター

rchar: 517268
wchar: 0
syscr: 93
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0
4

1 に答える 1

2

Python インタープリターのpipe_w待機状態は問題です。空のパイプから読み取ろうとしているか、満杯のパイプに書き込もうとしているために実行できません。

コード、インタープリター、またはその両方で使用されているブロックバッファリングがあり、どちらを判断するのに十分なのかを示していません。

コメントに応じて追加:

あなたはブロック バッファリングを行っていないと思いますが、stdio ライブラリが知らないうちにブロック バッファリングを行っている可能性があります。簡単なことを考えてみましょう:

main()
{
    puts("print ('hello, world!')\n");
    sleep(3600);
}

これを端末から実行すると、端末に出力print ('hello, world!')され、予想どおり 1 時間スリープします。これは、stdio ライブラリがそれstdoutが端末であることを検出しwrite()、すべての改行でそのバッファを実行するためです。これは、人々が準備ができたときに行バッファリングされた出力を見たいと思っているためです。ただし、このプログラムの出力を にパイプするpythonと、端末には 1 時間何も表示されません。これは、stdio ライブラリがstdoutパイプであると認識し、ブロック バッファ モードに切り替えるためです。ブロック バッファリング モードでは、stdio はBUFSIZ書き込む文字があり、最新のマシンBUFSIZでは 4096 以上になるまで待機します。

「デバッガーが渡された入力を読み取っていることを確認できます」と言うと、stdio のこのモード切り替えのため、端末でデバッガーをテストしても、プロセス間通信がバッファーされているかどうかについては実際には何もわかりません。 . の出力は、psバッファリング中であることを示唆しています。バッファリングを制御する方法については、 setvbufを参照してください。

または、 useless の代わりにコードを表示することもできました/proc/n/io。私のpythonレポート:

rchar: 288789
wchar: 0
syscr: 108
syscw: 0
read_bytes: 0
write_bytes: 0
cancelled_write_bytes: 0

/proc/n/wchanしかし、それはまだ出力を提供しておらず、時間になるまで出力しません。

pipe_wait

予想通り。

于 2013-05-05T01:10:44.930 に答える