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.