在dup()
之後調用fclose()
此文件描述符塊直到子進程結束(可能是因爲流已結束)。fclose()/ pclose()可能在某些文件指針上阻塞
FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);
然而,通過手動執行pipe()
,fork()
,所述popen()
的execvp()
,然後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 *
從popen()
返回,並在其位置使用文件描述符?
更新:
我知道文檔說,使用pclose()
,但是fclose()
塊爲好。此外,我在glibc代碼中探索,pclose()
只需撥打fclose()
。行爲是相同的,無論是使用fclose()
還是pclose()
。
你知道爲什麼從'popen()'塊關閉'FILE *'的唯一方法。也許你可以多解釋一下你的問題的一部分還沒有答案? – Andomar 2009-11-20 09:30:38