web-dev-qa-db-fra.com

Quelles sont les valeurs possibles pour les descripteurs de fichier?

Je suis intéressé de connaître les valeurs valides que je peux attendre pour un descripteur de fichier.

S'il vous plaît laissez-moi expliquer un peu. Je sais que, par exemple, lorsque j'utilise #include <unistd.h> sur mon système linux, un appel est ensuite ouvert pour lire un fichier:

int fileDescriptor;
fileDescriptor = open("/some/filename",O_RDONLY);

une erreur peut se produire et je reçois -1 en conséquence.
Incidemment, le (-1) négatif doit avoir une signification particulière. Est-ce que toutes les autres valeurs sont des descripteurs de fichier valides? c'est-à-dire aussi des négatifs comme -2 et -1023?

En supposant que int soit 4 octets (sizeof(int)==4), alors

(-1) = 10000000 0000000 00000000 00000001

serait le seul descripteur de fichier invalide détectable? Est-ce que d'autres aimeraient:

  • (0) = 00000000 0000000 00000000 00000000
  • (-2) = 10000000 0000000 00000000 00000010
  • (2) = 00000000 0000000 00000000 00000010

être d'accord? Puisque le descripteur de fichier peut stocker 4 octets, je pourrais donc avoir un maximum de (2 ^ (8 * 4) -1) descripteurs de fichier valides et, par conséquent, ce serait le nombre maximum de fichiers que je peux avoir ouverts, correct?

Pour le dire encore:

À quoi dois-je m'attendre d'un descripteur de fichier (valide)?

toute valeur sauf -1?

10
humanityANDpeace

De la page de manuel :

open() renvoie un descripteur de fichier, un petit entier non négatif .

et alors:

open() et creat() renvoient le nouveau descripteur de fichier, ou -1 en cas d'erreur

15
Oliver Charlesworth

Lorsque open fail, il renvoie -1 ou 0xffffffff. Cela n'a pas de sens mais open a échoué:

En cas de succès, la fonction doit ouvrir le fichier et renvoyer un entier non négatif représentant le descripteur de fichier non utilisé ayant le plus petit numéro. Sinon, -1 doit être renvoyé et errno contient le code d'erreur. Aucun fichier ne doit être créé ou modifié si la fonction renvoie -1.

La raison de l'échec est stockée dans errno , vous pouvez lire sa valeur et vérifier s'il s'agit de l'une des causes d'échec possibles EACCES, EEXIST, EINTR .. etc, ou utilisez simplement perror pour imprimer le message d'erreur.

2
user1129665

Voici ce que Linux page de manuel dit:

open() et creat() renvoient le nouveau descripteur de fichier, ou -1 en cas d'erreur (auquel cas, errno est défini correctement).

D'autres systèmes peuvent renvoyer d'autres valeurs négatives en cas d'erreur.

1
meaning-matters

La plage de valeurs possibles des descripteurs de fichier va de 0 à 1023 pour les systèmes Linux (systèmes 32 bits ou 64 bits).

Vous ne pouvez pas créer de descripteur de fichier dont la valeur est supérieure à 1023. Dans le cas d'un descripteur de fichier de valeur 1024, une erreur EBADF sera renvoyée (descripteur de fichier incorrect, erreur no-9).

Lorsqu'une valeur négative de descripteur de fichier est renvoyée, cela signifie qu'une erreur s'est produite.

1
premal