fclose()在dup()其文件描述符块之后调用此处直到子进程结束(可能是因为流已经结束).
FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);
Run Code Online (Sandbox Code Playgroud)
但是通过手动进行pipe(),fork(),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]);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,如何关闭FILE *返回的popen()并在其位置使用文件描述符?
更新:
我知道文档说要使用pclose(),但是fclose()块也是如此.此外,我在glibc代码中搜索,并且pclose()只是调用fclose().该行为是相同的,是否fclose()或pclose()使用.