在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()的。