プログラムへのパイプを開いて、そこからの出力を読み取りたいと思いました。私の最初の傾向はpopen()を使用することでしたが、プログラムにはいくつかのオプションがあり、シェルの引用/エスケープと戦うのではなく、pipe()、fork()、dup()の組み合わせを使用して親/子のstdin/stdoutへのパイプの終わり、および子をプログラムの呼び出しに置き換えるexecv()は、配列として期待されるすべてのオプションを渡しました。
プログラムは多くの行のデータを出力します(そして各行の後にstdoutをフラッシュします)。親コードはstdinを非ブロッキングに設定し、fgets()を使用してループ内でstdinから読み取ります。fgets()がNULL以外を返すか、stdinにEAGAINまたはEWOULDBLOCKのエラー条件がある間、ループが実行されます。
ほとんどの行を正常に受信しますが、最後にドロップオフするように見え、最後のfgets()が失敗し、「そのようなファイルまたはディレクトリはありません」という奇妙なエラーが発生します。
私がここで間違ったことをしたかもしれないことを誰かが知っていますか?