質問: open(pipepath,O_WRONLY); とすると割当がないはずの0がfdに入ります。 そのため後のwrite処理で「bad file descriptor」が発生します。 解決策は何かありますでしょうか。 宜しくお願い致します。 OS : ubuntu 16.04 LTS 言語 : c++
回答: open時にfd 0がclose済みという話ではないでしょうか? 以下のプログラムを動かすと(もちろん別shellで`cat /tmp/pipe`としてopenの先へ進むようにし) 最後のfdの値は期待通り3となりました。 ``` #include #include #include int main() { int fd; const char* pipepath = "/tmp/pipe"; mkfifo(pipepath, 0666); fd = open(pipepath, O_WRONLY); fprintf(stderr, "fd = %d\n", fd); return 0; } ``` Ubuntu 16.04 LTSです 追記:解決されたようですが回答が尻切れなので補足します。 上記はopenの結果が0になることについてのものです。エラーが発生した原因に言及してませんが、close(0)をやっているらしいことから例えばパイプ接続した子供プロセスの生成のようなことをしているのではないかと推測しました。そういうことをする場合標準入出力を一旦closeしてpipeとしてopenしなおすといったことをすると思うので、その処理の前後でclose済みのファイルディスクリプターへ誤ってI/Oしてしまったといった話ではないかと思いました。