“Lecture courte” du système de fichiers, quand peut-il arriver?

Il est évident qu’en général, l’appel système read (2) peut renvoyer moins d’octets que ce qui a été demandé. Cependant, plusieurs programmes supposent que lorsque vous travaillez avec des fichiers locaux, read (2) ne retourne jamais moins que ce qui a été demandé (à moins que le fichier ne soit plus court, bien sûr).

Donc, ma question est: sous Linux, dans quels cas read (2) peut-il retourner moins que ce qui a été demandé si la lecture d’un fichier ouvert et EOF n’est pas rencontrée et que la quantité lue est de quelques kilo-octets au maximum?

Quelques suppositions:

  • Les signaux reçus peuvent-ils interrompre une lecture comme celle-ci, mais ne pas la faire échouer?
  • Différents systèmes de fichiers peuvent-ils affecter ce comportement? Y a-t-il quelque chose de spécial à propos de jffs2?

POSIX.1-2008 déclare :

La valeur renvoyée peut être inférieure à nbyte si le nombre d’octets restant 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 une FIFO ou un fichier spécial octets octets immédiatement disponibles pour la lecture.

Les systèmes de fichiers sur disque utilisent généralement des lectures ininterruptibles, ce qui signifie que l’opération de lecture ne peut généralement pas être interrompue par un signal. Les systèmes de fichiers basés sur le réseau utilisent parfois des lectures interruptibles, qui peuvent renvoyer des données partielles ou aucune donnée. (Dans le cas de NFS, cette option est configurable à l’aide de l’option intr mount.) Ils implémentent parfois également des délais d’attente.

Gardez à l’esprit que même un fichier / some / arbitrary / file / path peut faire référence à un fichier FIFO ou à un fichier spécial. Il est donc recommandé de gérer les lectures partielles même si elles sont peu probables.

Je dois demander: “Pourquoi vous souciez-vous de la raison”? Si read peut renvoyer un nombre d’octets inférieur à la quantité demandée (ce qui, comme vous le faites remarquer, cela peut certainement être le cas), pourquoi ne voudriez-vous pas faire face à cette situation?

Un signal reçu uniquement fait que read () échoue s’il n’a pas encore lu un seul octet. Sinon, il renverra des données partielles.

Et je suppose que les systèmes de fichiers alternatifs peuvent en effet renvoyer des lectures courtes dans d’autres situations. Par exemple, il est logique (pour moi) de faire en sorte qu’un système de fichiers basé sur un réseau se comporte exactement comme un socket réseau avec des lectures courtes (= les avoir souvent).

Si c’est vraiment un fichier que vous lisez, alors vous pouvez lire brièvement comme dernière lecture avant la fin du fichier.

Cependant, il est généralement préférable de se comporter comme si une lecture pouvait être une courte lecture. Si ce que vous lisez est un tube ou un périphérique d’entrée (stdin) plutôt qu’un fichier, vous pouvez obtenir une lecture courte lorsque votre tampon est plus grand que ce qui est actuellement dans le tampon d’entrée.

Je ne suis pas sûr mais cette situation pourrait se produire lorsque le système d’exploitation est à court de pages dans le cache de la page. Vous pourriez suggérer que le thread de vidage soit appelé dans ce cas, mais cela dépend de l’heuristique utilisée dans le planificateur d’E / S. Cette situation pourrait entraîner une lecture pour renvoyer moins d’octets.

Ce que j’ai toujours lu s’appelant “lecture courte” n’est pas lié à l’access au fichier read (2) mais à la lecture physique d’un secteur de disque. Cela se produit lorsque, lors de la lecture de la partie données du secteur, les signaux magnétiques valides sont moins nombreux que ceux des 512 (ou 4096 ou autres) octets d’un secteur. Cela fait un secteur invalide et une erreur de lecture. En ce qui concerne “quand”, ou plutôt pourquoi cela se produit, c’est probablement parce que l’alimentation élecsortingque du disque est tombée pendant que ce secteur était écrit.
Se pourrait-il qu’une lecture (2) se termine par un code d’erreur physique appelé “lecture courte”?