2017-10-03 2 views
2

Für formatiert schreibt mit fprintf(), ich bin mit einem FILE Zeiger von einem Dateideskriptor von mkstemp() (see this link) erstellt erhalten:richtig schließen eine Datei sowohl mit einem Dateideskriptor und Dateizeiger

fd = mkstemp(tmpName); 

FILE *fp = fdopen(fd, "w"); 
fprintf(fp, "#EXTM3U\n"); 

Was das ist richtige Prozedur, um die Datei zu schließen?

fclose(fp) // only? 

fclose(fp); // both? 
close(fd); 

close(fd); // only? 
+1

C oder C++: Wählen sie eine, sie sind nicht die gleiche Sprache. – abelenky

+2

Im Wesentlichen die gleiche Frage wie in https://stackoverflow.com/questions/108043/closing-cleaning-up-mixed-file-descriptors-sockets. –

Antwort

2

Von the docs:

Die fdopen() Funktion verbindet einen Stream mit der bestehenden Datei Beschreiber, fd.

[...]

Der Dateideskriptor nicht dup'ed wird, und wird geschlossen, wenn der Strom durch erstellt fdopen() geschlossen ist.

Bitte beachten Sie auch:

Der Modus des Stroms (einer der Werte "r", "r +", "w", "w +", "a", " a + ") muss mit dem Modus der Datei Deskriptor kompatibel sein.

0

Manpage für fdopen gibt die folgenden:

nicht der Dateideskriptor dup'ed wird, und wird geschlossen, wenn die von fdopen erstellt Strom() geschlossen ist.

Manpage für fclose dies unterstützt:

Die fclose() -Funktion wird das Äquivalent einer close() auf dem Dateideskriptor durchführen, die mit dem Strom, auf den Strom

zugeordnet ist

So fclose genug ist ...

+0

Wie verhält es sich mit den Informationen in https://stackoverflow.com/a/13691168/1187415 und http://pubs.opengroup.org/onlinepubs/9699919799/functions/fclose.html? * "Die Funktion fclose() soll das Äquivalent eines close() für den Dateideskriptor ausführen, der dem Stream zugeordnet ist, auf den der Stream zeigt" * –

+0

@MartinR, Sie haben Recht! Ich stehe korrigiert. –

Verwandte Themen