0

プログラムへのパイプを開いて、そこからの出力を読み取りたいと思いました。私の最初の傾向はpopen()を使用することでしたが、プログラムにはいくつかのオプションがあり、シェルの引用/エスケープと戦うのではなく、pipe()、fork()、dup()の組み合わせを使用して親/子のstdin/stdoutへのパイプの終わり、および子をプログラムの呼び出しに置き換えるexecv()は、配列として期待されるすべてのオプションを渡しました。

プログラムは多くの行のデータを出力します(そして各行の後にstdoutをフラッシュします)。親コードはstdinを非ブロッキングに設定し、fgets()を使用してループ内でstdinから読み取ります。fgets()がNULL以外を返すか、stdinにEAGAINまたはEWOULDBLOCKのエラー条件がある間、ループが実行されます。

ほとんどの行を正常に受信しますが、最後にドロップオフするように見え、最後のfgets()が失敗し、「そのようなファイルまたはディレクトリはありません」という奇妙なエラーが発生します。

私がここで間違ったことをしたかもしれないことを誰かが知っていますか?

4

3 に答える 3

3

問題が見つかりました。私はばかげて、反復ごとに errno をゼロにリセットしていませんでした。fgets() がそれか何かを処理すると思っただけだと思います...私のばかげた間違いです。現在、正常に動作しています。常にerrnoをリセットしてください!

とにかく助けてくれてありがとう。

于 2010-01-10T03:56:08.337 に答える
0

確かではありませ んブロッキングの問題やパイプの可能性など....

于 2010-01-10T03:11:48.457 に答える
0

STDERR へのパイプを開いていることを確認してください。ほとんどのプログラムは、STDIN の代わりにエラー データをそこに書き込みます。

于 2010-01-10T03:14:49.987 に答える