2017-10-03 15 views
2

Pour format écrit avec fprintf(), j'utilise un pointeur FILE obtenu à partir d'un descripteur de fichier créé par mkstemp() (see this link):fermer correctement un fichier à la fois un descripteur de fichier et le pointeur de fichier

fd = mkstemp(tmpName); 

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

Quelle est la procédure correcte pour fermer le fichier?

fclose(fp) // only? 

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

close(fd); // only? 
+1

C ou C++: Choisissez un, ils ne sont pas la même langue. – abelenky

+2

Essentiellement la même question que dans https://stackoverflow.com/questions/108043/closing-cleaning-up-mixed-file-descriptors-sockets. –

Répondre

2

De the docs:

La fonction fdopen() associe un flux avec le descripteur de fichier existant, fd.

[...]

Le descripteur de fichier n'est pas dup'ed et sera fermé lorsque le flux créé par fdopen() est fermé.

S'il vous plaît noter également:

Le mode du flux (l'une des valeurs "r", "r +", "w", "w +", "a", " a + ") doit être compatible avec le mode du fichier descripteur.

0

La page de manuel pour fdopen spécifie les éléments suivants:

Le descripteur de fichier n'est pas dup'ed et sera fermé lorsque le flux créé par fdopen() est fermé.

La page de manuel pour fclose soutient ceci:

La fonction fclose() doit effectuer l'équivalent d'un proche() sur le descripteur de fichier qui est associé au flux pointé par stream

Alors, fclose suffit ...

+0

Comment cela se rapporte-t-il aux informations données dans https://stackoverflow.com/a/13691168/1187415 et http://pubs.opengroup.org/onlinepubs/9699919799/functions/fclose.html? * "La fonction fclose() doit exécuter l'équivalent d'un close() sur le descripteur de fichier associé au flux pointé par stream" * –

+0

@MartinR, vous avez raison! Je me suis trompé. –