Comment puis-je convertir un pointeur de fichier (FILE * fp) en descripteur de fichier (int fd)?

174

J'ai un FILE *, renvoyé par un appel à fopen(). J'ai besoin d'en obtenir un descripteur de fichier, pour faire des appels comme fsync(fd)celui-ci. Quelle est la fonction pour obtenir un descripteur de fichier à partir d'un pointeur de fichier?

Phil Miller
la source
Ou vous pouvez ouvrir le fichier avec open (2), et vous auriez un descripteur de fichier du début
Antoine Pelisse

Réponses:

214

La bonne fonction est int fileno(FILE *stream). Il peut être trouvé dans <stdio.h>, et est un standard POSIX mais pas le standard C.

Phil Miller
la source
4
À proprement parler, il ne serait pas nécessaire de mentionner des en-têtes ou des bibliothèques si la fonction faisait effectivement partie de la bibliothèque C standard. Cependant, ce n'est pas standard, c'est pourquoi il peut être judicieux de mentionner au moins l'en-tête.
Du
20
L'accès aux fonctions de la bibliothèque C standard nécessite l'inclusion d'en-têtes, du moins si votre compilateur attend des prototypes (je ne me souviens jamais de ce qui est réellement le comportement standard à cet égard). Sans en-têtes, aucun nom n'est défini au début d'un fichier C.
Phil Miller
1
@Novelocrat: Je ne voulais pas dire qu'il n'y avait besoin de #includerien. Je voulais simplement dire qu'il est toujours facile de trouver le nom de l'en-tête approprié pour une fonction standard . C'est-à-dire qu'il n'est pas vraiment essentiel de mentionner le nom exact de l'en-tête dans la réponse.
Du
9
C'est une bonne réponse, mais il convient de noter que ce n'est pas une fonction c standard, c'est une fonction posix.
Evan Teran du
6
Ce n'est pas dans le standard C, car les descripteurs de fichiers sont une chose UNIX (sous Linux, il est ouvert (2), pas ouvert (3)).
not-a-user
42

Même s'il fileno(FILE *)peut renvoyer un descripteur de fichier, veillez TRÈS à ne pas contourner le tampon de stdio. S'il existe des données de tampon (en lecture ou en écriture non vidangée), les lectures / écritures à partir du descripteur de fichier peuvent vous donner des résultats inattendus.

Pour répondre à l'une des questions secondaires, pour convertir un descripteur de fichier en pointeur FILE, utilisez fdopen(3)

Mark Gerolimatos
la source
1
Je ne pense pas que cela ait été utile pour les personnes qui recherchent cela en particulier, et cela a déjà été répondu dans la section des commentaires du post d'OP un mois avant que cela ne soit écrit. Il s'agit davantage d'une clarification logique que d'une information réelle.
kevr
4
Les commentaires qui sont tellement importants doivent être soulevés comme réponses. Un pourcentage énorme de commentaires sont des méta-commentaires sournois et inutiles comme le vôtre ... et celui-ci;)
Mark Gerolimatos