Funció de lectura POSIX a la programació C.

Posix Read Function C Programing



En els sistemes operatius tradicionals compatibles amb POSIX, per obtenir informació d’un document contingut en un sistema de fitxers, un programa feia servir la trucada del sistema de lectura. El fitxer defineix un descriptor de documents al qual s’accedeix normalment des d’una trucada prèvia per obrir. Aquesta trucada de sistema de lectura llegeix la informació en bytes i el nombre enter que especifica la persona que truca al document i, a continuació, la desa en un buffer proporcionat pel mecanisme de trucada.

Funció Definició

Abans de definir la funció de lectura al vostre codi, heu d’incloure alguns paquets necessaris.







#incloure

A continuació, es defineix la funció de lectura POSIX:



>>ssize_t pread(intmarfil,buit *buf,mida_tnbyte, off_t offset);
>>ssize_t llegit(intfd,buit *buf,mida_tnbytes);

Es poden treure tres arguments de paràmetres de la trucada del mètode de lectura:



int fd: El descriptor del fitxer des d’on s’ha de llegir la informació. Podríem utilitzar un descriptor de fitxers adquirit mitjançant una trucada al sistema obert, o bé només podríem utilitzar 0, 1 o 2 referint-se a l'entrada típica, sortida normal o error normal, respectivament.





Buid * buf: La matriu de memòria intermèdia o de caràcters en què s'han de desar i conservar les dades llegides.

Size_t nbyte: El nombre de bytes que calia llegir del document abans de truncar. Tota la informació es pot emmagatzemar a la memòria intermèdia si la informació que cal llegir és inferior a nbytes.



Descripció

El mètode read () intenta llegir bytes 'nbyte' a la memòria cau de memòria intermèdia a què fa referència 'buf' des del fitxer connectat amb el descriptor de document obert 'Fildes' o 'fd'. No defineix la naturalesa de diverses lectures simultànies en el mateix flux, FIFO o unitat terminal.

Als documents que permeten la lectura, el procés de lectura comença des del desplaçament del document i el desplaçament augmenta en el nombre de bytes llegits. Si la compensació del document és superior o superior a la vora del fitxer, no hi ha cap byte llegit i read () no en produeix cap.

Quan el recompte és 0, read () reconeixerà els errors esmentats a continuació. Si no hi ha errors, o si no es té en compte error (read (), una lectura () produeix zero amb un recompte de 0 i, per tant, no té cap altra repercussió.

Si el recompte és superior a SSIZE_MAX, segons POSIX.1, el resultat serà determinat per la implementació.

Valor de retorn

El nombre de bytes 'llegits' i 'pread' revertits en assolir-se ha de ser un enter no negatiu mentre que zero apunta al final del fitxer. Aquest número avança la posició del document, o bé, per significar un error, els mètodes retornen -1 i assignen 'errno'. Quan aquesta xifra és inferior al nombre de bytes sol·licitats, no és un byte d'error. Podria ser possible que hi hagi menys bytes disponibles per ara.

Errors

La funció de lectura i lectura no tindrà èxit si es produeixen aquests errors:

TORNAR A:

El descriptor de fitxers o documents ‘fd’ pertany a un fitxer sense sòcol que s’ha etiquetat com a no bloquejador (O NONBLOCK) i bloquejarà la lectura.

BLOC EWOULD:

El descriptor ‘fd’ pertany a un sòcol que s’ha etiquetat com a no bloquejador (O_NONBLOCK) i bloquejarà la lectura.

EBADF:

És possible que el ‘fd’ no sigui un descriptor utilitzable o que no estigui obert a la lectura.

IMPRESSIÓ:

Això passa quan el vostre 'buf' es troba fora de l'espai d'adreces accessible.

EINTR:

Abans de la lectura de les dades d'informació, la trucada pot haver-se trencat per un senyal.

SELECCIÓ:

Aquest error es produeix quan el vostre descriptor 'fd' està involucrat en un objecte que no és adequat per a la lectura o el document es va deslligar amb el senyalador O_DIRECT i amb una o altra adreça indicada a 'buf', el valor indicat a 'count ', o la compensació del document no està associada adequadament.

SELECCIÓ:

És possible que el descriptor ‘fd’ s’hagi format mitjançant una trucada a timerfd_create (2) i s’hagi donat la lectura de la memòria intermèdia de mida incorrecta.

EIO:

És un error d’entrada / sortida. Es produeix quan el grup de processos en segon pla intenta llegir des del seu terminal regulador, i un o altre passa per alt o bloqueja SIGTTIN, o el seu grup de processos queda en desús. Un altre motiu d’aquest error podria ser un error d’entrada / sortida de baix nivell mentre es llegia des d’un disc dur o una cinta. Una altra causa potencial d'EIO als fitxers de dades en xarxa és l'eliminació del bloqueig d'assessorament al descriptor de fitxers i la fallada d'aquest bloqueig.

EISDIR:

El descriptor de fitxers ‘fd’ pertany a un directori.

Notes:

També es poden produir molts altres errors, en funció de l’objecte vinculat al descriptor ‘fd’. Tant els formularis size_t com ssize_t són tipus de dades numèrics no marcats i marcats definits per POSIX.1. A Linux, es poden transmetre com a màxim 0x7ffff000 (2.147.479.552) bytes mitjançant la funció de lectura (i trucades de sistema equivalents), retornant el nombre de bytes transmesos originalment (tant en plataformes de 32 bits com de 64 bits). Amb els sistemes de fitxers NFS, el primer moment en què es modifica la marca de temps mitjançant la lectura de petits fluxos d’informació, les trucades posteriors no ho farien. S’activa mitjançant la memòria cau d’atributs del costat del client, ja que, tot i que no tots, els clients NFS deixen d’actualitzar-se al servidor mitjançant st_atime (darrer temps d’accés al fitxer) i les lectures del costat del client realitzades des de la memòria intermèdia del client no desencadenarien canvis a st- atime al servidor, ja que no hi ha lectures disponibles al costat del servidor. En eliminar la memòria cau d’atributs del costat del client, es pot accedir a les metadades UNIX, però això augmentaria significativament la càrrega al servidor i afectaria la productivitat en la majoria dels casos.

Exemple 01:

Aquí teniu un programa C per demostrar la trucada de funció de lectura al sistema Linux. Escriviu l'ordre següent tal com es troba en un fitxer nou. Afegiu biblioteques i, a la funció principal, inicialitzeu un descriptor i una mida. El descriptor obre el fitxer i la mida s’utilitza per llegir les dades del fitxer.

La sortida del codi anterior seria la que es mostra a la imatge següent.

Exemple 02:

A continuació es dóna un altre exemple per il·lustrar el funcionament de la funció de lectura.

Creeu un altre fitxer i escriviu el codi següent tal com hi és. Aquí hi ha dos descriptors, fd1 i fd2, que tenen tots dos el seu propi accés a fitxers de taula oberta. Per tant, per a foobar.txt, tots els descriptors tenen la seva ubicació de fitxer. El primer byte de foobar.txt es tradueix de fd2 i el resultat és c = f, no c = o.

Conclusió

Hem llegit la funció de lectura POSIX a la programació C de manera eficient. Amb sort, no queden dubtes.