回答編集履歴

2

追記

2017/02/01 10:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

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

1

追記

2017/02/01 10:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

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