teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2017/02/01 10:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -22,3 +22,9 @@
22
22
  ```
23
23
 
24
24
  Ubuntu 16.04 LTSです
25
+
26
+ ---
27
+
28
+ 追記:解決されたようですが回答が尻切れなので補足します。
29
+
30
+ 上記はopenの結果が0になることについてのものです。エラーが発生した原因に言及してませんが、close(0)をやっているらしいことから例えばパイプ接続した子供プロセスの生成のようなことをしているのではないかと推測しました。そういうことをする場合標準入出力を一旦closeしてpipeとしてopenしなおすといったことをすると思うので、その処理の前後でclose済みのファイルディスクリプターへ誤ってI/Oしてしまったといった話ではないかと思いました。

1

追記

2017/02/01 10:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,1 +1,24 @@
1
- open時にfd 0close済みという話ではないでしょうか?
1
+ open時にfd 0close済みという話ではないでしょうか?
2
+
3
+ ---
4
+
5
+ 以下のプログラムを動かすと(もちろん別shellで`cat /tmp/pipe`としてopenの先へ進むようにし)
6
+ 最後のfdの値は期待通り3となりました。
7
+
8
+ ```c
9
+ #include <stdio.h>
10
+ #include <sys/stat.h>
11
+ #include <sys/fcntl.h>
12
+
13
+ int main() {
14
+ int fd;
15
+ const char* pipepath = "/tmp/pipe";
16
+ mkfifo(pipepath, 0666);
17
+ fd = open(pipepath, O_WRONLY);
18
+
19
+ fprintf(stderr, "fd = %d\n", fd);
20
+ return 0;
21
+ }
22
+ ```
23
+
24
+ Ubuntu 16.04 LTSです