在ing 其文件描述符阻塞之后调用fclose()
此处,直到子进程结束(可能是因为流已经结束)。dup()
FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);
但是,通过手动执行pipe()
, fork()
, execvp()
,popen()
然后dup()
ing 管道的读取文件描述符,关闭原始文件不会阻塞。
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 *
返回popen()
并在其位置使用文件描述符?
更新:
我知道文档说要使用pclose()
,但是fclose()
也有块。此外,我在 glibc 代码中四处寻找,然后pclose()
只调用fclose()
. fclose()
无论使用或使用,行为都是相同pclose()
的。