6
votes

Quelle est la limite de lecture de la fonction 'Lire' dans 'Unistd.h'?

Standard Unix C a cette fonction: xxx

mais quels sont les octets maximum que cette fonction "lecture" peut lire 1 fois?


1 commentaires

@Tomalak: La question ne concerne aucune langue.


4 Réponses :


1
votes

lire () prend un descripteur de fichier ouvert, l'adresse d'un tampon et un nombre, nombre d'octets. Il tente de lire les octets comptant dans le tampon du fichier décrit par le descripteur. Il est important de Assurez-vous que BUF pointe au moins de compter au moins les octets de stockage!

Il peut lire autant que votre tampon peut contenir, la limite est SSIZE_MAX et les limites de votre matériel.


4 commentaires

Vous ne pouvez pas demander plus que Taille_max octets, et puisque vous voulez probablement savoir à quel point vous avez réussi à lire (et à suivre la spécification), vous êtes limité à SSIZE_MAX BYTES.


@janne: Mais Taille_max est 0xFFFFFFFFF (VC ++)! Vous voulez vraiment dire ce nombre?


@Paul: taille_max ! = ssize_max .


Quoi qu'il en soit, «signé» ou «non signé», ce * _max est toujours un nombre de 32 bits, terriblement volumineux pour un fichier régulier. C'est vraiment bien si possible de lire jusqu'à * _max octets!



2
votes

généralement, il peut lire autant d'octets qu'il est disponible dans buf . En réalité, le pilote de périphérique sous-jacent (soyez-lui le système de fichiers ou le réseau, ou un tuyau), reviendrait moins que ce que vous voulez au cas où il n'y ait rien de plus disponible.

Ainsi, le comportement particulier de lu dépend du pilote sous-jacent dans le noyau.

C'est pourquoi il est important de toujours vérifier la valeur de retour de lire et examiner la lecture réelle lue.


0 commentaires

12
votes

de homme lu (2) :

lu () tente de lire jusqu'à compter les octets à partir de descripteur de fichier FD dans Le tampon commence à BUF.

Si le compte est zéro, lisez () retourne zéro et n'a aucun autre résultat. si Le nombre est supérieur à ssize_max , le résultat n'est pas spécifié.

La valeur de ssize_max dépend de votre système, mais il s'agit généralement de la valeur maximale de signée longue , qui est souvent 2 31 (Systèmes 32 bits) ou 2 63 (systèmes 64 bits).

2 31 Les octets sont 2 gigaoctets, vous êtes donc probablement en sécurité; En pratique, le pilote de périphérique / tampons / E / S du réseau n'est jamais vous donner une partie de données de 2 gigaoctets en une fois.


0 commentaires

2
votes

Devis de IEEE STD 1003.1 (AKA POSIX.1)

Si la valeur de nbyte est supérieure à {ssize_max}, le résultat est défini par la mise en œuvre.

Vous devez donc vérifier man 2 lue sur votre plate-forme cible. Par exemple, FreeBSD Man dit dans la partie Erreurs:

[einval] La valeur nbytes est supérieure à int_max.


0 commentaires