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()です。