C Programmation

Fonction de lecture POSIX en programmation C

Fonction de lecture POSIX en programmation C
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 précédent appel à l'ouverture 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 d'appel.

Définition de la fonction

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

#inclure

Voici comment définir la fonction de lecture POSIX :

>> ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
>> ssize_t read(int fd, void *buf, size_t nbytes);

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

int fd : Le descripteur 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 faisant référence à une entrée typique, une sortie régulière ou une erreur régulière, 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 de tronquer. 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 référencé 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 la mise en œuvre.

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, ce n'est pas 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, l'appel peut avoir été interrompu par un signal.

EINVAL :

Cette erreur se produit lorsque votre descripteur 'fd' est impliqué dans un objet, qui n'est pas adapté à la lecture, ou que le document a été délié avec le flag 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.

EINVAL :

Le descripteur 'fd' a peut-être été formé à l'aide d'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 formulaires 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, les métadonnées UNIX sont accessibles, 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. Ajouter des bibliothèques, et dans la fonction principale, initialiser 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 pour le 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 au fichier de table ouverte. Donc 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.

Remappez les boutons de votre souris différemment pour différents logiciels avec X-Mouse Button Control
Peut-être que vous avez besoin d'un outil qui pourrait faire changer le contrôle de votre souris avec chaque application que vous utilisez. Si tel est...
Examen de la souris sans fil Microsoft Sculpt Touch
J'ai lu récemment sur le Microsoft Sculpt Touch souris sans fil et j'ai décidé de l'acheter. Après l'avoir utilisé pendant un certain temps, j'ai déci...
Trackpad et pointeur de souris à l'écran AppyMouse pour tablettes Windows
Les utilisateurs de tablettes ratent souvent le pointeur de la souris, surtout lorsqu'ils ont l'habitude d'utiliser les ordinateurs portables. Les sma...