fclose()
子プロセスが終了するまで、ファイル記述子ブロックを ing した後、ここで呼び出しますdup()
(おそらくストリームが終了したため)。
FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);
ただし、のpipe()
、fork()
、を手動で実行してから、パイプの読み取りファイル記述子を ing すると、元のファイルを閉じてもブロックされません。execvp()
popen()
dup()
int p[2];
pipe(p);
switch (fork()) {
case 0: {
char *argv[] = {"./output", NULL};
close(p[0]);
dup2(p[1], 1);
execvp(*argv, argv);
}
default: {
close(p[1]);
int d = dup(p[0]);
close(p[0]);
}
}
なぜこれが発生するのですか? また、FILE *
返された fromを閉じてpopen()
、代わりにファイル記述子を使用するにはどうすればよいですか?
アップデート:
ドキュメントには を使用するように記載されていますがpclose()
、fclose()
ブロックも同様です。さらに、私は glibc コードをいじって、 をpclose()
呼び出すだけfclose()
です。fclose()
またはを使用しても、動作は同じpclose()
です。