Lorsque j'appelle execl(...)
, j'obtiens un errno=2
. Qu'est-ce que ça veut dire? Comment puis-je en connaître la signification errno
?
221
Vous pouvez utiliser strerror()
pour obtenir une chaîne lisible par l'homme pour le numéro d'erreur. Il s'agit de la même chaîne imprimée parperror()
mais elle est utile si vous formatez le message d'erreur pour autre chose que la sortie d'erreur standard.
Par exemple:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux prend également en charge la variante explicitement threadsafe strerror_r()
.
strerror()
n'est pas thread-safe tandis qu'ilstrerror_r()
est thread-safe. Les fonctions MT-Safe ou Thread-Safe peuvent être appelées en toute sécurité en présence d'autres threads. MT, dans MT-Safe, signifie Multi Thread. -p26, La bibliothèque GNU Cchar * strerror(int errnum )
[Fonction] Préliminaire: | Course MT-Unsafe: strerror | Tas AS18 non sûr | AC-mem dangereux | Voir Section 1.2.2.1 [Concepts de sécurité POSIX], page 2. -p58, La bibliothèque GNU Cerrno
est thread-safe. Regardez:#define errno *__errno_location()
errno
,strerror
écrit GNU libc dans le tampon global interne . Il ne le fait pas toujours, mais dans certains cas, il le fait. Vous écraserez ce tampon pendant qu'un autre thread le lit.errno
, nonstrerror()
.Au lieu de fonctionner
perror
sur n'importe quel code d'erreur que vous obtenez, vous pouvez récupérer une liste complète deserrno
valeurs sur votre système avec la ligne unique suivante:cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
la source
Sous Linux, il existe également un outil très soigné qui peut dire tout de suite ce que signifie chaque code d'erreur. Sur Ubuntu:
apt-get install errno
.Ensuite, si par exemple vous voulez obtenir la description du type d'erreur 2, tapez simplement
errno 2
dans le terminal.Avec
errno -l
vous obtenez une liste avec toutes les erreurs et leurs descriptions. Beaucoup plus facile que les autres méthodes mentionnées par les affiches précédentes.la source
perror
/strerror
est meilleure car alors l'UTILISATEUR n'a pas à le rechercher. Bien,errno -l
c'est mieux pour les trouver.Voici la sortie de
errno -l
reformaté pour plus de lisibilité:J'ai utilisé tabularise dans Vim pour aligner les colonnes:
la source
Le code d'erreur 2 signifie "Fichier / répertoire introuvable". En général, vous pouvez utiliser la fonction perror pour imprimer une chaîne lisible par l'homme.
la source
Il existe quelques fonctions utiles pour traiter de l'
errno
art. (Juste pour être clair, ceux-ci sont intégrés àlibc
- je fournis simplement des exemples d'implémentations parce que certaines personnes trouvent la lecture du code plus claire que la lecture de l'anglais.)strerror
renvoie une chaîne décrivant le numéro d'erreur que vous lui avez transmis. Attention, ce n'est pas sûr pour les threads ou les interruptions; il est libre de réécrire la chaîne et de renvoyer le même pointeur lors de la prochaine invocation. À utiliserstrerror_r
si vous devez vous en soucier.perror
imprime le message que vous lui donnez, plus une chaîne décrivant le couranterrno
, en erreur standard.la source
some people find reading code clearer than reading English
vérité.C'est plus rapide que de rechercher le code
errno.h
, plus court que la plupart des solutions publiées ici et cela ne nécessite pas l'installation d'outils tiers:perl -E 'say $!=shift' 2
les rendements
No such file or directory
la source
-E
traite le code entre guillemets suivant comme un script Perl.say
écrit ses arguments sur la sortie standard.$!
est une variable spéciale contenant la valeur deerrno
. S'il est utilisé dans un contexte de chaîne, il renvoie la chaîne d'erreur correspondante. Le script attribue la valeur2
à cette variable à l'aide de lashift
commande, qui coupe la tête du tableau d'arguments@ARGV
et place cette tête à sa place. La ligne de commande aurait également pu être écrite commeperl -E 'say $!=2'
.Fonctionne sur Solaris.
cc perror.c -o perror
<< utilisez cette ligne pour la compilerla source
perror(NULL);
? Avecperror("");
son format est: ERROR NAME
. Avecperror(NULL);
sa sortie est justeERROR NAME
Voici la documentation . Cela devrait vous dire ce que cela signifie et ce que vous devez en faire. Vous devez éviter d'utiliser la valeur numérique et utiliser également les constantes qui y sont répertoriées, car le nombre peut varier entre différents systèmes.
la source
errnoname
bibliothèque . Il prend en charge la partie fastidieuse de la collecte de tous les noms d'erreur possibles dans une fonction C qui peut être utilisée de manière triviale pour obtenir le nom de la macro d'erreur à partir du numéro. En utilisant cela comme base, faire votreperror
variante devrait être rapide et facile.J'utilise le script suivant:
la source
Tapez
sudo apt-get install moreutils
, puis une fois installé, tapezerrno 2
. Vous pouvez également utilisererrno -l
pour tous les numéros d'erreur, ou seulement ceux de fichiers par elle à la tuyauteriegrep
, comme ceci:errno | grep file
.la source
Appel
en cas d'erreur.
Échantillon:
Les pages de manuel de
errno(3)
etperror(3)
sont également intéressantes ...la source
Lorsque vous utilisez strace (sous Linux) pour exécuter votre binaire, il affichera les retours des appels système et la signification du numéro d'erreur. Cela peut parfois vous être utile.
la source
J'ai la fonction suivante dans mon fichier .bashrc - il recherche la valeur errno des fichiers d'en-tête (peut être soit
/usr/include/errno.h
,/usr/include/linux/errno.h
etc., etc.)Cela fonctionne si les fichiers d'en-tête sont installés sur la machine ;-)
Habituellement, le fichier d'en-tête a une erreur + vient ensuite l'explication dans le commentaire; quelque chose de ce qui suit:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Réessayez * /
la source
Ça veut dire:
la source