回答編集履歴
2
追記
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
追記
answer
CHANGED
@@ -1,1 +1,24 @@
|
|
1
|
-
open時にfd 0
|
1
|
+
open時にfd 0がclose済みという話ではないでしょうか?
|
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です
|