Je veux créer un numéro d'erreur unique, composé d'un nombre aléatoire et du errno
d'un appel système. Exemple:Quelle est la valeur d'erreur maximale?
#define ERRID(ERRNO) ((uint32_t)rand() << 16 | (uint32_t)(ERRNO) & 0xFFFF)
Je dois savoir combien de bits sont requis pour stocker une valeur errno
. Je sais qu'il est défini int
. Mais le nombre total d'erreurs est très inférieur à 9 223 372 036 854 775 807 sur un système 64 bits. Sur mon Debian le nombre maximum semble être 529.
dpkg -L linux-headers-3.16.0-4-common|
grep errno.h|
xargs cat|
awk '/^#define/{print $3}'|
sort -rn|
head -1
529
Alors uint16_t
semble être suffisant pour stocker les errno
.
Mais comment être sûr? Comment puis-je savoir combien d'erreurs le système d'exploitation utilise réellement? Est-il documenté n'importe où?
** Pourquoi ** vous devez utiliser 'int16_t' si elle est définie comme' int' ?! OS est libre d'ajouter n'importe quel numéro d'erreur où il veut dans le prochain correctif, deux jours après avoir publié votre application en supposant qu'il contienne un entier signé de 16 bits. –
Pouvez-vous utiliser une structure, comme 'struct UniqueError {int randNumber, int errnoNumber};'? C'est ce que je considérerais, en termes de portabilité, au lieu de s'appuyer sur la valeur «maximum» de errno (qui pourrait changer dans le temps et d'un système à l'autre) –
'int' est seulement 32 bits sur Linux 64 bits. –