Quiero saber la diferencia entre un descriptor de archivo y un puntero de archivo.
Además, ¿en qué escenario usaría uno en lugar del otro?
c
file-descriptor
file-pointer
karthi_ms
fuente
fuente
Respuestas:
Un descriptor de archivo es un "identificador" entero de bajo nivel que se usa para identificar un archivo abierto (o socket, o lo que sea) a nivel del kernel, en Linux y otros sistemas similares a Unix.
Pasa descriptores de archivos "desnudos" a llamadas Unix reales, como
read()
,write()
etc.Un
FILE
puntero es una construcción de nivel de biblioteca estándar de C, que se utiliza para representar un archivo. LaFILE
envuelve el descriptor de archivo y añade tampón y otras características para hacer de E / S más fácil.Pasa
FILE
punteros a funciones C estándar comofread()
yfwrite()
.fuente
fd
es el primer argumento deread()
. ¿Por qué lo llamas desnudo?FILE *
tipo de biblioteca estándar , el descriptor de archivo entero está "menos envuelto", es decir, "desnudo".Uno está almacenado en búfer (
FILE *
) y el otro no. En la práctica, querrá usarFILE *
casi siempre cuando esté leyendo de un archivo 'real' (es decir, en la unidad), a menos que sepa lo que está haciendo o que su archivo sea en realidad un socket o algo así.Puede obtener el descriptor de archivo
FILE *
usandofileno()
y puede abrir un búferFILE *
desde un descriptor de archivo usandofdopen()
fuente
Un descriptor de archivo es solo un número entero que se obtiene de la
open()
llamada POSIX . Usando el estándar Cfopen()
obtienes unaFILE
estructura. LaFILE
estructura contiene este descriptor de archivo, entre otras cosas, como el indicador de fin de archivo y error, la posición de la secuencia, etc.Por lo tanto, usar
fopen()
le brinda una cierta cantidad de abstracción en comparación conopen()
. En general, debería usarlo,fopen()
ya que es más portátil y puede usar todas las demás funciones estándar de C que usan laFILE
estructura, es decir,fprintf()
y la familia.No hay problemas de rendimiento al usar ninguno.
fuente
Descriptor de archivo vs puntero de archivo
Descriptor de archivo:
El descriptor de archivo es un valor entero devuelto por una
open()
llamada al sistema.int fd = open (filePath, mode);
Puntero de archivo:
File Pointer es un puntero a una estructura C devuelta por la
fopen()
función de biblioteca, que se utiliza para identificar un archivo, envolver el descriptor de archivo, la funcionalidad de almacenamiento en búfer y todas las demás funciones necesarias para la operación de E / S. El puntero de archivo es de tipo FILE , cuya definición se puede encontrar en "/usr/include/stdio.h" . Esta definición puede variar de un compilador a otro.fuente
Quiere agregar puntos que puedan ser útiles.
ACERCA DE
FILE *
Lo uso muchas veces para depurar registros. ejemplo,
ACERCA DE
FILE DESCRIPTOR
Generalmente se usa para IPC.
Da control de bajo nivel a archivos en sistemas * nix (dispositivos, archivos, sockets, etc.), por lo que es más poderoso que el
FILE *
.fuente
fdopen()
para hacer cosas como IPC y dispositivos conFILE*
?FILE*
, pero puede crear unFILE*
descriptor de archivo (fdopen()
) y luego cerrarloFILE
también cerrará el descriptor. Por lo tanto, puede hacer IPC, pero debe lidiar un poco con los descriptores de archivos para facilitar cualquier IPC directo.FILE *
es más útil cuando se trabaja con archivos de texto y de usuario de entrada / salida, ya que permite el uso de funciones de la API comosprintf()
,sscanf()
,fgets()
,feof()
etc.La API del descriptor de archivos es de bajo nivel, por lo que permite trabajar con sockets, tuberías, archivos mapeados en memoria (y archivos normales, por supuesto).
fuente
Solo una nota para terminar la discusión (si está interesado) ....
fopen
puede ser inseguro, y probablemente debería usarfopen_s
oopen
con bits exclusivos establecidos. C1X está ofreciendox
modos, por lo que puedefopen
con los modos"rx"
,"wx"
, etc.Si usa
open
, podría consideraropen(..., O_EXCL | O_RDONLY,... )
oopen(..., O_CREAT | O_EXCL | O_WRONLY,... )
.Consulte, por ejemplo, No haga suposiciones sobre fopen () y la creación de archivos .
fuente
fopen_s
no parece estar disponible conPOSIX
, supongo que el soultion más portátil seríaopen(2)
y luegofdopen(2)
. (dejando las ventanas a un lado). Además, ¿qué sería más rápidofopen_s()
oopen(2)
seguidofdopen(2)
?Las llamadas al sistema utilizan principalmente descriptores de archivos, por ejemplo
read
ywrite
. La función de biblioteca utilizará los punteros de archivo (printf
,scanf
). Pero, las funciones de la biblioteca solo utilizan llamadas internas al sistema.fuente
Encontré un buen recurso aquí , que brinda una descripción general de alto nivel de las diferencias entre los dos:
fuente