2015-09-18 1 views
1

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ù?

+4

** 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. –

+1

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) –

+1

'int' est seulement 32 bits sur Linux 64 bits. –

Répondre

3

Il n'y a pas de moyen portable de le faire. POSIX (et C) permet à l'implémentation d'utiliser toutes les valeurs int positives comme numéros d'erreur, il n'y a pas de constante pour le nombre maximal utilisé et il peut ne pas y avoir un type entier supérieur à int.

+1

Un 'MAX_ERRNO' serait si simple. – ceving

2

Vous pouvez juste passer autour d'une poignée au lieu qui contient fois le code d'erreur errno et l'identifiant aléatoire (je suppose que vous voulez que ce soit un identifiant unique afin de pouvoir identifier les cas spécifiques d'erreurs plus tard ...?)

struct ErrorID { 
    int errno_error; 
    int rand_id; 
} 

ErrorID this_func_can_fail() 
{ 
    return (ErrorID){ .errno_error = errno, .rand_id = rand() }; 
} 

Cette compile:

#include <errno.h> 
#include <stdlib.h> 

struct ErrorID { 
    int errno_error; 
    int rand_id; 
}; 

struct ErrorID this_func_can_fail() 
{ 
    return (struct ErrorID){ .errno_error = errno, .rand_id = rand() }; 
} 

int main (int argc, char *argv[]) 
{ 
    this_func_can_fail(); 
    return 0; 
} 
+0

Le code ne compile pas: 'errid.c: 6: 9: erreur: attendu '=', ',', ';', 'asm' ou '__attribute__' avant 'this_func_can_fail'' – ceving

+0

+1 pour signaler que il est possible d'utiliser des structures comme valeurs dans C: http://stackoverflow.com/questions/9653072/return-a-struct-from-a-function-in-c – ceving

+0

@ceving merci. Ce n'était pas un exemple compilable complet - c'est juste une démo rapide de mon idée. –