écrire un appel système, quel est le nombre d’octets limité?

Le prototype d’appel du système d’écriture est:

ssize_t write(int fd, const void *buf, size_t count); 

Le paramètre count est unsigned et la valeur de retour est signée.

La page d’aide dit:

En cas de succès, le nombre d’octets écrits est renvoyé (zéro indique que rien n’a été écrit). En cas d’erreur, -1 est renvoyé et errno code d’erreur.

Cependant, il ne dit pas quelle est la limite du paramètre count. Il ne dit toujours pas le comportement lorsque count est supérieur à SSIZE_MAX .

Considérant qu’écrire est un appel système qui peut être utilisé pour des périphériques / fichiers génériques / peu importe, si le périphérique prend en charge les opérations d’écriture supérieures à SSIZE_MAX, le type de retour ne peut pas gérer le nombre réel d’octets écrits.

Cela n’a aucun sens pour moi de pouvoir transmettre un nombre non signé d’octets et de récupérer un nombre d’octets signé en conséquence. Pourquoi ne pas simplement passer un numéro signé?

On a l’impression que le prototype de la fonction d’écriture est en quelque sorte prédisposé aux erreurs, ou du moins laisse un trou possible dans le chemin.

Est-ce que quelqu’un connaît les détails à ce sujet ou où puis-je trouver cette information?

Je ne pense pas qu’il y ait une limite ssortingcte, cela dépend de ce que fd pointe. Si c’est un fichier sur le système de fichiers par exemple, alors le pilote du système de fichiers va s’étouffer si vous dépassez la “taille maximale du fichier”, renvoyant l’erreur EFBIG:

EFBIG Une tentative d’écriture d’un fichier dépassant la taille de fichier maximale définie par l’implémentation ou la limite de taille du fichier de processus a été effectuée.

Googled il:

Si la valeur de nbyte est supérieure à {SSIZE_MAX} , le résultat est défini par l’implémentation.

Source: http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html

Je pense que rappelez-vous que le système alloue le nombre d’octets que vous donnez à la fonction. Mais je ne suis pas sur. Peut-être essaierez-vous les pages de manuel size_t et ssize_t.