read (fd, NULL, 0); Qu’est ce que ça fait? est-ce bien défini?

J’ai vu la déclaration suivante dans quelques programmes, la plupart / tous semblent être faits pour Linux.

rv = read(fd, NULL, 0); 

Dans certains programmes, il est en boucle, dans certains, une seule déclaration.

Que fait-il vraiment?

La page de manuel indique qu’une telle invocation peut ou non vérifier les erreurs …

Quelle est la signification de la valeur de retour?

Quels types de descripteurs de fichiers sont pris en charge?

Et si rv==0 comment distinguer “pas d’erreur” de par exemple “socket fermé”.

Cet appel effectuera toutes les vérifications d’erreur habituelles sur le descripteur de fichier, mais ne récupérera aucune donnée. Ceci est utile si vous souhaitez par exemple déterminer si le descripteur de fichier est toujours valide sans le bloquer.

Il renverra -1 si une erreur survient et 0 sinon. La plupart des erreurs listées dans man 2 read peuvent être interrogées de cette manière et seront renvoyées dans errno .

Par exemple, une valeur de retour de -1 et une errno de EBADF seront renvoyées si le descripteur de fichier est fermé. Au lieu de cela, la valeur retournée sera 0 si tout va bien et une autre read ne retournera pas une erreur associée à la validité du descripteur de fichier.

Une read ultérieure avec un tampon réel et nbyte > 0 peut toujours générer un nombre d’erreurs tel que ENOMEM , EAGAIN , …