READ |
Lecture |
---|---|
unistd.h |
Syntaxe
ssize_t read(int fildes, void *buf, size_t nbyte); |
Paramètres
Nom | Description |
---|---|
fildes | Ce paramètre permet d'indiquer le descripteur de fichier Handle. |
buf | Ce paramètre permet d'indiquer le tampon allant recevoir les données. |
nbyte | Ce paramètre permet d'indiquer la taille du tampon en octets. |
Description
Cette fonction permet d'effectuer la lecture d'un fichier.
Remarques
- La fonction read() tentera de lire nbyte du fichier associé au descripteur de fichier ouvert, fildes, dans le tampon pointé par le paramètre buf. Le comportement de plusieurs lectures simultanées sur le même tube, FIFO ou périphérique terminal n'est pas spécifié.
- Avant toute action, et si le paramètre nbyte est égal à zéro, la fonction read() peut détecter et renvoyer des erreurs. En l'absence d'erreurs, ou si la détection d'erreur n'est pas effectuée, la fonction read() renverra zéro et n'aura aucun autre résultat.
- Sur les fichiers prenant en charge la recherche (par exemple, un fichier normal), la fonction read() doit commencer à une position dans le fichier donnée par le déplacement de fichier associé à fildes. Le déplacement de fichier doit être incrémenté du nombre d'octets réellement lus.
- Les fichiers ne prenant pas en charge la recherche - par exemple, les terminaux - lisent toujours à partir de la position actuelle. La valeur d'un déplacement de fichier associé à un tel fichier n'est pas définie.
- Aucun transfert de données ne doit avoir lieu au-delà de la fin de fichier actuelle. Si la position de départ est à la fin ou après la fin du fichier, 0 doit être renvoyé. Si le fichier fait référence à un fichier spécial de périphérique, le résultat des requêtes read() suivantes est défini par la mise en oeuvre.
- Si la valeur de nbyte est supérieure à {SSIZE_MAX}, le résultat est défini par la mise en oeuvre.
- Lors d'une tentative de lecture à partir d'un tube vide ou FIFO : si aucun processus n'a le tube ouvert pour l'écriture, la fonction read() retournera 0 pour indiquer la fin du fichier; si un processus a le tube ouvert pour l'écriture et que O_NONBLOCK est défini, la fonction read() retournera -1 et définira errno sur [EAGAIN]; si un processus a le tube ouvert pour l'écriture et O_NONBLOCK est vide, la fonction read() bloquera le processus léger appelant jusqu'à ce que certaines données soient écrites ou que le tube soit fermé par tous les processus ayant le tube ouvert pour l'écriture.
- Lors d'une tentative de lecture d'un fichier (autre qu'un tube ou un FIFO) prenant en charge les lectures non bloquantes et n'ayant pas de données actuellement disponibles : si O_NONBLOCK est défini, alors la fonction read() retournera -1 et définira errno sur [EAGAIN]; si O_NONBLOCK est vide, alors la fonction read() bloquera le processus léger appelant jusqu'à ce que certaines données deviennent disponibles; l'utilisation de l'indicateur O_NONBLOCK n'a aucun effet si certaines données sont disponibles.
- La fonction read() lit les données précédemment écrites dans un fichier. Si une partie d'un fichier normal avant la fin du fichier n'a pas été écrite, la fonction read() retournera des octets avec la valeur 0. Par exemple, la fonction lseek() permet de définir le déplacement du fichier au-delà de la fin des données existantes dans le fichier. Si des données sont écrites ultérieurement à ce stade, les lectures suivantes dans l'intervalle entre la fin précédente des données et les données nouvellement écrites renverront des octets avec la valeur 0 jusqu'à ce que les données soient écrites dans l'intervalle.
- En cas de réussite, où le paramètre nbyte est supérieur à 0, la fonction read() marquera pour mise à jour le champ st_atime du fichier et retournera le nombre d'octets lus. Ce nombre ne doit jamais être supérieur à nbyte. La valeur renvoyée peut être inférieure à nbyte si le nombre d'octets restants dans le fichier est inférieur à nbyte, si la requête read() a été interrompue par un signal, ou si le fichier est un tube ou FIFO ou un fichier spécial et a moins de nbyte octets immédiatement disponibles pour la lecture. Par exemple, une fonction read() d'un fichier associé à un terminal peut renvoyer une ligne de données typée.
- Si une fonction read() est interrompu par un signal avant de lire des données, il retournera -1 avec errno mis à [EINTR].
- Si une fonction read() est interrompu par un signal après avoir lu avec succès certaines données, il renverra le nombre d'octets lus.
- Pour les fichiers normaux, aucun transfert de données ne doit avoir lieu au-delà du décalage maximal établi dans la description de fichier ouvert associée aux fildes.
- Si le paramètre fildes fait référence à une socket, la fonction read() sera équivalent à recv() sans aucun paramètre défini.
- Si les bits O_DSYNC et O_RSYNC ont été mis à 1, les opérations d'entrées/sorties de lecture sur le descripteur de fichier doivent se terminer comme défini par l'achèvement de l'intégrité des données d'entrées/sorties synchronisées. Si les bits O_SYNC et O_RSYNC ont été mis à 1, les opérations d'entrées/sorties de lecture sur le descripteur de fichier doivent se terminer comme défini par l'achèvement de l'intégrité du fichier d'entrée/sortie synchronisé.
- Si le paramètre fildes fait référence à un objet de mémoire partagée, le résultat de la fonction read() n'est pas spécifié.
- Si le paramètre fildes fait référence à un objet mémoire typé, le résultat de la fonction read() n'est pas spécifié.
- Une fonction read() à partir d'un fichier STREAMS peut lire des données dans trois modes différents : mode de flux d'octets, mode de non-rejet de message et mode de suppression de message. La valeur par défaut doit être le mode flux d'octets. Cela peut être modifié à l'aide de la requête ioctl() avec la commande I_SRDOPT, et peut être testé avec la fonction ioctl() avec la commande I_GRDOPT. En mode flux d'octets, la fonction read() doit récupérer les données du STREAM jusqu'à ce que le nombre d'octets demandés soit transféré, ou jusqu'à ce qu'il n'y ait plus de données à récupérer. Le mode Byte-stream ignore les limites des messages.
- En mode message non ignoré STREAMS, la fonction read() doit récupérer des données jusqu'à ce que le nombre d'octets demandés soit transféré, ou jusqu'à ce qu'une limite de message soit atteinte. Si la fonction read() ne récupère pas toutes les données d'un message, les données restantes doivent être laissées sur le STREAM et peuvent être récupérées par le prochain appel read(). Le mode de suppression de message récupère également les données jusqu'à ce que le nombre d'octets demandés soit transféré ou qu'une limite de message soit atteinte. Cependant, les données non lues restantes dans un message après le retour de la fonction read() doivent être ignorées et ne doivent pas être disponibles pour un appel ultérieur de read(), getmsg() ou getpmsg().
- La manière dont la fonction read() gère les messages STREAMS de zéro octet est déterminée par le paramètre de mode de lecture actuel. En mode flux d'octets, la fonction read() doit accepter des données jusqu'à ce qu'il ait lu nbyte octets, ou jusqu'à ce qu'il n'y ait plus de données à lire, ou jusqu'à ce qu'un bloc de message de zéro octet soit rencontré. La fonction read() retournera alors le nombre d'octets lus, et remettra le message de zéro octet sur le STREAM pour être récupéré par le prochain read(), getmsg() ou getpmsg(). En mode message sans rejet ou en mode message sans rejet, un message de zéro octet renverra 0 et le message sera supprimé du STREAM. Lorsqu'un message de zéro octet est lu comme premier message sur un STREAM, le message doit être supprimé du STREAM et 0 doit être renvoyé, quel que soit le mode de lecture.
- Une fonction read() à partir d'un fichier STREAMS doit renvoyer les données dans le message au début de la file d'attente de lecture de tête STREAM, quelle que soit la bande de priorité du message.
- Par défaut, les STREAM sont en mode contrôle normal, dans lequel un read() à partir d'un fichier STREAMS ne peut traiter que les messages contenant une partie de données mais ne contiennent pas de partie de contrôle. La fonction read() échouera si un message contenant une partie commande est rencontré à la tête STREAM. Cette action par défaut peut être modifiée en plaçant le STREAM en mode contrôle-données ou contrôle-rejet avec la commande I_SRDOPT de ioctl(). En mode contrôle-données, la fonction read() doit convertir toute partie de contrôle en données et la transmettre à l'application avant de transmettre toute partie de données initialement présente dans le même message. En mode contrôle-rejet, la fonction read() doit rejeter les parties de commande de message mais renvoyer au processus toute partie de données du message.
- De plus, la fonction read() échouera si la tête STREAM avait traité une erreur désynchronisé avant l'appel. Dans ce cas, la valeur de errno ne doit pas refléter le résultat de la fonction read(), mais refléter l'erreur précédente. Si un raccrochage se produit sur le STREAM en cours de lecture, la fonction read() continuera à fonctionner normalement jusqu'à ce que la file d'attente de lecture de tête STREAM soit vide. Par la suite, il renverra 0.
- La fonction pread() doit être équivalente à read(), sauf qu'elle doit lire à partir d'une position donnée dans le fichier sans changer le pointeur de fichier. Les trois premiers paramètres de pread() sont les mêmes que read() avec l'ajout d'un quatrième paramètre de déplacement pour la position souhaitée dans le fichier. Une tentative de pread() sur un fichier incapable de rechercher entraînera une erreur.
Voir également
Langage de programmation - C pour Linux - Référence procédures et fonctions - close
Dernière mise à jour : Dimanche, le 10 décembre 2017