Fonction de lecture POSIX en programmation C

Posix Read Function C Programing



Dans les systèmes d'exploitation traditionnels compatibles POSIX, pour obtenir des informations à partir d'un document contenu dans un système de fichiers, un programme utilisait l'appel système read. Un descripteur de document auquel on accède généralement à partir d'un appel antérieur à open est défini par le fichier. Cet appel système read lit les informations en octets et l'entier spécifié par l'appelant à partir du document, puis les enregistre dans une mémoire tampon fournie par le mécanisme appelant.

Définition de la fonction

Avant de définir la fonction read dans votre code, vous devez inclure certains packages requis.







#comprendre

Voici comment définir la fonction de lecture POSIX :



>>ssize_t pré lire(entierIvoire,annuler *buf,taille_tnoctet, décalage off_t);
>>ssize_t lire(entierfd,annuler *buf,taille_tnoctets);

Trois arguments de paramètre peuvent être extraits de l'appel de la méthode read :



int fd : Le descripteur de fichier du fichier à partir duquel les informations doivent être lues. Nous pourrions soit utiliser un descripteur de fichier acquis via un appel système ouvert, soit simplement utiliser 0, 1 ou 2 en référence à une entrée typique, une sortie normale ou une erreur normale, respectivement.





Vide *buff : Le tampon ou le tableau de caractères dans lequel les données lues doivent être enregistrées et conservées.

Size_t noctet : Le nombre d'octets qui devaient être lus à partir du document avant la troncature. Toutes les informations peuvent être stockées dans le tampon si les informations à lire sont plus courtes que noctets.



La description

La méthode read() essaie de lire les octets « nbyte » dans le cache tampon désigné par « buf » à partir du fichier connecté au descripteur de document ouvert « Fildes » ou « fd ». Il ne définit pas la nature de plusieurs lectures simultanées sur le même flux, FIFO ou terminal.

Sur les documents qui permettent la lecture, le processus de lecture commence à l'offset du document, et l'offset est augmenté du nombre d'octets lus. Si le décalage du document est au niveau ou au-delà du bord du fichier, il n'y a pas d'octets lus et read() n'en renvoie aucun.

Lorsque le nombre est égal à 0, read() reconnaîtra les erreurs mentionnées ci-dessous. S'il n'y a pas d'erreurs, ou si read() n'est pas pris en compte avec Errors, un read() renvoie zéro avec un compte de 0 et n'a donc pas d'autres répercussions.

Si le nombre est supérieur à SSIZE_MAX, selon POSIX.1, alors le résultat est déterminé par l'implémentation.

Valeur de retour

Le nombre d'octets « read » et « pread » annulés lors de la réalisation doit être un entier non négatif tandis que zéro pointe vers la fin du fichier. La position du document est progressée de ce numéro, ou bien, pour signifier une erreur, les méthodes retournent -1 et attribuent 'errno'. Lorsque ce chiffre est inférieur au nombre d'octets demandés, il ne s'agit pas d'un octet d'erreur. Il est possible que moins d'octets soient disponibles pour le moment.

les erreurs

La fonction de lecture et de lecture échouera si ces erreurs se produisent :

ENCORE :

Le descripteur de document ou de fichier « fd » appartient à un fichier non-socket qui a été étiqueté comme non bloquant (O NONBLOCK) et bloquera la lecture.

EWOUBLOCK:

Le descripteur 'fd' appartient à une socket qui a été étiquetée comme non bloquante (O_NONBLOCK) et bloquera la lecture.

EBADF :

Le « fd » peut ne pas être un descripteur utilisable, ou il peut ne pas être ouvert à la lecture.

EFAULT :

Cela se produit lorsque votre 'buff' est en dehors de votre espace d'adressage accessible.

EINTR :

Avant la lecture des données d'information, la communication peut avoir été interrompue par un signal.

SÉLECTION:

Cette erreur se produit lorsque votre descripteur 'fd' est impliqué dans un objet, qui n'est pas approprié à la lecture, ou que le document a été délié avec le drapeau O_DIRECT, et l'une ou l'autre adresse indiquée dans 'buf', la valeur indiquée dans 'count ', ou le décalage du document n'est pas associé de manière appropriée.

SÉLECTION:

Le descripteur 'fd' a peut-être été formé en utilisant un appel à timerfd_create(2), et le tampon de taille incorrecte a été donné à lire.

EIO :

C'est une erreur d'entrée/sortie. Cela se produit lorsque le groupe de processus d'arrière-plan tente de lire à partir de son terminal de réglementation et que l'un ou l'autre ignore ou bloque SIGTTIN, ou que son groupe de processus est en deuil. Une autre raison de cette erreur pourrait être une erreur d'entrée/sortie de bas niveau lors de la lecture à partir d'un disque dur ou d'une bande. Une autre cause potentielle d'EIO sur les fichiers de données en réseau est la suppression du verrouillage consultatif sur le descripteur de fichier et l'échec de ce verrouillage.

EISDIR :

Le descripteur de fichier 'fd' appartient à un répertoire.

Remarques:

De nombreuses autres erreurs peuvent également se produire, en fonction de l'objet lié au descripteur « fd ». Les formes size_t et ssize_t sont des types de données numériques non marqués et marqués définis par POSIX.1. Sous Linux, au plus 0x7ffff000 (2 147 479 552) octets peuvent être transmis par la fonction de lecture (et les appels système équivalents), renvoyant le nombre d'octets transmis à l'origine (sur les plates-formes 32 bits et 64 bits). Avec les systèmes de fichiers NFS, juste au premier moment où l'horodatage est modifié en lisant de minuscules flux d'informations, les appels suivants ne le feraient pas. Il est déclenché par la mise en cache des attributs côté client car, bien que pas tous, les clients NFS quittent la mise à jour vers le serveur via st_atime (heure du dernier accès au fichier) et les lectures côté client effectuées à partir du tampon du client ne déclencheraient pas de modifications à st- atime sur le serveur car aucune lecture côté serveur n'est disponible. En supprimant la mise en cache des attributs côté client, il est possible d'accéder aux métadonnées UNIX, mais cela augmenterait considérablement la charge sur le serveur et affecterait la productivité dans la plupart des cas.

Exemple 01 :

Voici un programme C pour démontrer l'appel de la fonction de lecture sur le système Linux. Écrivez la commande ci-dessous telle qu'elle est dans un nouveau fichier. Ajoutez des bibliothèques et, dans la fonction principale, initialisez un descripteur et une taille. Le descripteur ouvre le fichier et la taille est utilisée pour lire les données du fichier.

La sortie du code ci-dessus serait comme indiqué dans l'image ci-dessous.

Exemple 02 :

Un autre exemple pour illustrer le fonctionnement de la fonction de lecture est donné ci-dessous.

Créez un autre fichier et notez le code ci-dessous tel qu'il s'y trouve. Voici deux descripteurs, fd1 et fd2, qui ont tous deux leur propre accès aux fichiers de table ouverte. Ainsi, pour foobar.txt, chaque descripteur a son emplacement de fichier. Le tout premier octet de foobar.txt est traduit de fd2, et le résultat est c = f, pas c = o.

Conclusion

Nous avons lu efficacement la fonction de lecture POSIX en programmation C. Espérons qu'il n'y ait plus de doutes.