Je veux connaître la différence entre un descripteur de fichier et un pointeur de fichier.
De plus, dans quel scénario utiliseriez-vous l'un au lieu de l'autre?
c
file-descriptor
file-pointer
karthi_ms
la source
la source
Réponses:
Un descripteur de fichier est un "handle" d'entier de bas niveau utilisé pour identifier un fichier ouvert (ou socket, ou autre) au niveau du noyau, sous Linux et d'autres systèmes de type Unix.
Vous passez des descripteurs de fichiers "nus" aux appels Unix réels, tels que
read()
,write()
etc.Un
FILE
pointeur est une construction de niveau bibliothèque standard C, utilisée pour représenter un fichier. L'FILE
encapsule le descripteur de fichier et ajoute une mise en mémoire tampon et d'autres fonctionnalités pour faciliter les E / S.Vous passez des
FILE
pointeurs vers des fonctions C standard telles quefread()
etfwrite()
.la source
fd
est le premier argument deread()
. Pourquoi appelez-vous cela nu?FILE *
, le descripteur de fichier entier est "less wrapped", c'est-à-dire "nu".L'un est tamponné (
FILE *
) et l'autre non. En pratique, vous voulez l'utiliserFILE *
presque toujours lorsque vous lisez à partir d'un 'vrai' fichier (c'est-à-dire sur le lecteur), à moins que vous ne sachiez ce que vous faites ou à moins que votre fichier ne soit en fait une socket ou quelque chose de similaire.Vous pouvez obtenir le descripteur de fichier à l'
FILE *
aide defileno()
et vous pouvez ouvrir une mémoire tampon àFILE *
partir d'un descripteur de fichier en utilisantfdopen()
la source
Un descripteur de fichier est juste un entier que vous obtenez de l'
open()
appel POSIX . En utilisant le standard C,fopen()
vous récupérez uneFILE
structure. LaFILE
structure contient ce descripteur de fichier entre autres, comme l'indicateur de fin de fichier et d'erreur, la position du flux, etc.Donc, utiliser
fopen()
vous donne une certaine quantité d'abstraction par rapport àopen()
. En général, vous devriez l'utiliserfopen()
car c'est plus portable et vous pouvez utiliser toutes les autres fonctions C standard qui utilisent laFILE
structure, ie,fprintf()
et la famille.Il n'y a aucun problème de performances avec l'un ou l'autre.
la source
Descripteur de fichier vs pointeur de fichier
Descripteur de fichier:
Le descripteur de fichier est une valeur entière renvoyée par
open()
un appel système.int fd = open (filePath, mode);
Pointeur de fichier:
Le pointeur de fichier est un pointeur vers une structure C renvoyée par la
fopen()
fonction de bibliothèque, qui est utilisée pour identifier un fichier, encapsuler le descripteur de fichier, la fonctionnalité de mise en mémoire tampon et toutes les autres fonctionnalités nécessaires aux opérations d'E / S. Le pointeur de fichier est de type FILE , dont la définition se trouve dans "/usr/include/stdio.h" . Cette définition peut varier d'un compilateur à l'autre.la source
Vous voulez ajouter des points qui pourraient être utiles.
À PROPOS
FILE *
Je l'utilise plusieurs fois pour les journaux de débogage. exemple,
À PROPOS
FILE DESCRIPTOR
Il est généralement utilisé pour IPC.
Donne un contrôle de bas niveau aux fichiers sur les systèmes * nix (périphériques, fichiers, sockets, etc.), donc plus puissant que le
FILE *
.la source
fdopen()
pour faire des choses comme IPC et des appareils avecFILE*
?FILE*
, mais vous pouvez créer un àFILE*
partir d'un descripteur de fichier (fdopen()
) et fermer ultérieurement leFILE
fermera également le descripteur. Par conséquent, vous pouvez faire IPC, mais vous devez gérer un peu les descripteurs de fichiers pour faciliter tout IPC direct.FILE *
est plus utile lorsque vous travaillez avec des fichiers texte et entrée / sortie utilisateur, car il vous permet d'utiliser les fonctions de l' API commesprintf()
,sscanf()
,fgets()
,feof()
etc.L'API de descripteur de fichier est de bas niveau, elle permet donc de travailler avec des sockets, des tubes, des fichiers mappés en mémoire (et des fichiers normaux, bien sûr).
la source
Juste un petit mot pour terminer la discussion (si intéressé) ...
fopen
peut être non sécurisé, et vous devriez probablement utiliserfopen_s
ouopen
avec un jeu de bits exclusif. C1X offre desx
modes, vous pouvez doncfopen
avec les modes"rx"
,"wx"
etc.Si vous utilisez
open
, vous pourriez envisageropen(..., O_EXCL | O_RDONLY,... )
ouopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.Voir, par exemple, Ne pas faire d'hypothèses sur fopen () et la création de fichiers .
la source
fopen_s
ne semble pas être disponible avecPOSIX
, je suppose que la soultion la plus portable serait deopen(2)
et ensuitefdopen(2)
. (laissant les fenêtres de côté). De plus, qu'est-ce qui serait plus rapidefopen_s()
ouopen(2)
suivifdopen(2)
?Les appels système utilisent principalement un descripteur de fichier, par exemple
read
etwrite
. La fonction de bibliothèque utilisera les pointeurs de fichier (printf
,scanf
). Mais les fonctions de bibliothèque utilisent uniquement des appels système en interne.la source
J'ai trouvé une bonne ressource ici , donnant un aperçu de haut niveau des différences entre les deux:
la source