GNU/Linux >> Tutoriels Linux >  >> Linux

Valeurs de plage errno définies par l'utilisateur (spécifiques à POSIX ou Linux)

Le véritable errno les valeurs ne sont pas définies par les normes C et C++. Il n'y a donc aucun moyen de renvoyer un entier (positif) particulier et de garantir qu'il n'entre pas en conflit avec celui utilisé par une implémentation. Le standard C ne nécessite que trois marco :

Brouillon C11, 7.5 Erreurs

Les macros sont

ÉDOM
EILSEQ
ERANGE

qui se développent en expressions constantes entières avec le type int, des valeurs positives distinctes, et qui conviennent pour une utilisation dans #if preprocessingdirectives ;

Donc vous ne savez pas quels autres errno les valeurs sont définies dans votre implémentation.

Le errno les valeurs sont des entiers positifs en C standard et POSIX. Vous pouvez donc utiliser votre propre énumération avec des valeurs négatives pour définir vos propres numéros d'erreur. Mais vous ne pouvez alors pas utiliser les interfaces strerror/perror. Vous aurez donc peut-être besoin d'un wrapper supplémentaire pour strerror/perror afin d'interpréter vos propres numéros d'erreur.

Quelque chose comme :

enum myErrors{
ERR1 = -1,
ERR2 = -2,
...
ERR64 = -64
};

char *my_strerror(int e)
{
   if (e>=ERR1 && e<=ERR2)
      return decode_myerror(e); // decode_myerror can have a map for  
                                //your error numbers and return string representing 'e'.
   else
      return strerror(e);
}

et un similaire pour perror .

Notez que vous devez également définir errno à 0 avant d'appeler votre "open-ressource" pour vous assurer que le errno a bien été défini par votre fonction.

J'éviterais complètement l'errno standard dans des situations comme celle-ci et définirais ma propre énumération pour les erreurs. Vous pouvez le faire si votre "ressource ouverte" n'est pas trop compliquée et renvoie trop de codes d'erreur possibles.


Linux
  1. Qu'est-ce que Posix exactement ?

  2. Exécuter la commande sur une plage définie de répertoires ?

  3. Supprimer les doublons dans un champ ?

  4. Canaliser une liste de valeurs vers un script bash ?

  5. Threads POSIX détachés ou joignables

Expression de séquence bash (plage)

Est-ce que errno est thread-safe ?

Quelle est la signification de POSIX ?

trouver des valeurs uniques dans un fichier de données

Imprimer errno comme mnémonique ?

Description des valeurs kernel.printk