【发布时间】:2010-12-16 18:10:21
【问题描述】:
在dup()ing 其文件描述符阻塞之后在这里调用fclose(),直到子进程结束(可能是因为流已经结束)。
FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);
但是通过手动执行popen()的pipe()、fork()、execvp(),然后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]);
}
}
为什么会发生这种情况,如何关闭从popen() 返回的FILE * 并使用文件描述符代替它?
更新:
我知道文档中说要使用 pclose(),但是 fclose() 也会阻止。此外,我查看了 glibc 代码,pclose() 只是调用了fclose()。无论使用fclose() 还是pclose(),行为都是相同的。
【问题讨论】:
-
你知道为什么从
popen()块中关闭FILE*的唯一定义方法。也许您可以多解释一下您的问题的哪一部分仍未得到解答?