相关疑难解决方法(0)

fclose()/ pclose()可能会阻塞某些文件指针

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()使用.

c unix stdio popen fclose

3
推荐指数
2
解决办法
6889
查看次数

标签 统计

c ×1

fclose ×1

popen ×1

stdio ×1

unix ×1