fclose () / pclose () pode bloquear em alguns ponteiros de arquivo

Chamandofclose() aqui depoisdup()seus blocos descritores de arquivos até que o processo filho tenha terminado (presumivelmente porque o fluxo terminou).

FILE *f = popen("./output", "r");
int d = dup(fileno(f));
fclose(f);

No entanto, executando manualmentepipe(), fork(), execvp() dopopen(), e depoisdup()o descritor de arquivo de leitura do tubo, o fechamento do original não é bloqueado.

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]);
    }
}

Por que isso ocorre e como posso fechar oFILE * retornou depopen() e usar um descritor de arquivo em seu lugar?

Atualizar:

Estou ciente de que a documentação diz para usarpclose(), Contudofclose() blocos também. Além disso, eu cutuquei o código da glibc epclose() apenas chamafclose(). O comportamento é o mesmo, sejafclose() oupclose() é usado.

questionAnswers(3)

yourAnswerToTheQuestion