Descriptor de fitxer
En els sistemes operatius d'ordinador Unix i similars a Unix, un descriptor de fitxer (FD, menys freqüentment fildes) és un identificador únic de procés (handle) per a un fitxer o un altre recurs d'entrada/sortida, com ara una canonada o un sòcol de xarxa.
Els descriptors de fitxers solen tenir valors enters no negatius, i els valors negatius es reserven per indicar "cap valor" o condicions d'error.
Els descriptors de fitxers formen part de l'API POSIX. Cada procés Unix (excepte potser els dimonis) hauria de tenir tres descriptors de fitxer POSIX estàndard, corresponents als tres fluxos estàndard:
Valor sencer | Nom | constant simbòlica [1] | flux de fitxers [2] |
---|---|---|---|
0 | Entrada estàndard | STDIN_FILENO | stdin |
1 | Sortida estàndard | STDOUT_FILENO | stdout |
2 | Error comú | STDERR_FILENO | stderr |
Visió general
![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/f8/File_table_and_inode_table.svg/300px-File_table_and_inode_table.svg.png)
En la implementació tradicional d'Unix, els descriptors de fitxers s'indexen en un per procés file descriptor table mantinguda pel nucli, que al seu torn s'indexa en una taula de fitxers oberta per tots els processos, anomenada file table. Aquesta taula registra el mode amb què s'ha obert el fitxer (o un altre recurs): per llegir, escriure, afegir i possiblement altres modes. També s'indexa en una tercera taula anomenada taula d'inodes que descriu els fitxers subjacents reals.[3] Per dur a terme l'entrada o la sortida, el procés passa el descriptor del fitxer al nucli mitjançant una crida al sistema, i el nucli accedirà al fitxer en nom del procés. El procés no té accés directe al fitxer o a les taules d'inodes.
A Linux, es pot accedir al conjunt de descriptors de fitxers oberts en un procés a la ruta /proc/PID/fd/
, on PID és l'identificador del procés. El descriptor de fitxer /proc/PID/fd/0
és stdin
, /proc/PID/fd/1
és stdout
i /proc/PID/fd/2
és stderr
. Com a drecera a aquests, qualsevol procés en execució també pot accedir als seus propis descriptors de fitxers a través de les carpetes /proc/self/fd
i /dev/fd
.[4]
En sistemes semblants a Unix, els descriptors de fitxers poden fer referència a qualsevol tipus de fitxer Unix anomenat en un sistema de fitxers. A més dels fitxers normals, això inclou directoris, dispositius de blocs i caràcters (també anomenats "fitxers especials"), sòcols de domini Unix i canalitzacions amb nom. Els descriptors de fitxers també poden fer referència a altres objectes que normalment no existeixen al sistema de fitxers, com ara canonades anònimes i endolls de xarxa.
L'estructura de dades FILE a la biblioteca d'E/S estàndard C inclou normalment un descriptor de fitxer de baix nivell per a l'objecte en qüestió en sistemes semblants a Unix. L'estructura general de dades proporciona una abstracció addicional i es coneix com a identificador de fitxers.
Operacions sobre descriptors de fitxers
A continuació s'enumeren les operacions típiques dels descriptors de fitxers en sistemes moderns semblants a Unix. La majoria d'aquestes funcions es declaren a la capçalera <unistd.h>
, però algunes es troben a la capçalera <fcntl.h>
.
1. Creació de descriptors de fitxers
2. Derivació de descriptors de fitxers
3. Operacions en un únic descriptor de fitxer
4. Operacions amb diversos descriptors de fitxers
5. Operacions a la taula de descriptors de fitxers
6. Operacions que modifiquen l'estat del procés
7. Bloqueig de fitxers
8. Endolls
9. Divers
Referències
- ↑ Error: hi ha arxiuurl o arxiudata però calen tots dos paràmetres.The Open Group. «[The Open Group The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 Edition]» (en anglès). [Consulta: 21 setembre 2017].
- ↑ The Open Group. «The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 Edition» (en anglès). [Consulta: 21 setembre 2017].
- ↑ 3,0 3,1 Bach, Maurice J. The Design of the UNIX Operating System (en anglès). 8. Prentice-Hall, 1986, p. 92–96. ISBN 9780132017992.
- ↑ «Devices - What does the output of 'll /Proc/Self/Fd/' (From 'll /Dev/Fd') mean?» (en anglès).