fclose () / pclose () blockiert möglicherweise einige Dateizeiger

Berufungfclose() hier nachherdup()Der Dateideskriptor wird blockiert, bis der untergeordnete Prozess beendet ist (vermutlich, weil der Stream beendet ist).

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

Durch manuelles Ausführen derpipe(), fork(), execvp() despopen(), und danndup()Das Schließen des Originals blockiert nicht, wenn der Deskriptor der gelesenen Datei der Pipe verwendet wird.

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

Warum tritt das auf und wie kann ich das schließen?FILE * zurückgekommen vonpopen() und stattdessen einen Dateideskriptor verwenden?

Aktualisieren:

Mir ist bewusst, dass die Dokumentation sagt, zu verwendenpclose(), jedochfclose() Blöcke auch. Außerdem habe ich mich im glibc-Code umgesehen undpclose() ruft einfach anfclose(). Das Verhalten ist das gleiche, obfclose() oderpclose() wird eingesetzt.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage