Effectuer une lecture non bloquante d’un fichier

Problème

Vous voulez lire un fichier, mais ne pas être bloqué si les données sont temporairement indisponibles.

Solution

Ouvrez le fichier en lecture avec fopen(fichier, O_RDONLY | O_NONBLOCK).

Discussion

La lecture non bloquante des données n’est pas possible avec les fonctions sur les flux. Il faut donc lire les données avec les fonctions de bas niveau open(), read() et close(). Il n’y a pas de particularité à la lecture non bloquante sauf la possibilité de lire une chaîne de taille nulle, ce qu’il faut donc tester. Prenons un exemple :


char buffer[1024]; 
int l; 
int fd = open (fichier, O_RDONLY | O_NONBLOCK); 
 
if (-1 == fd) 
  { 
    fprintf (stderr, 
             "Impossible d'ouvrir '%s' en lecture non bloquante\n", 
             fichier); 
  } 
while (-1 != (l = read (fd, buffer, 1024))) 
  { 
    if (l > 0) printf ("Lu %d octets ('%$s')\n", l, l, buffer); 
    else sleep (1); 
  } 
close (fd);
 

Voir aussi la recette "Créer un serveur TCP/IP mono-processus sans thread" du chapitre "Réseau" car il est aussi possible d’utiliser select() ou poll() comme décrit dans cette recette ; en effet, sockets et descripteurs de fichiers reviennent au même.

Pour consulter la suite, découvrez le livre suivant :
couv_EI3CACT.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Calculer la taille d'un fichier
Suivant
Classer un fichier texte