Référence errno Linux
Cherchez n'importe quelle valeur errno Linux par numéro, nom ou message et obtenez le symbole, ce que ça signifie, les vraies causes et les correctifs.
Cette référence errno Linux transforme un numéro tout sec, du genre errno 13 ou -EACCES dans un log, en une réponse concrète. Tapez le numéro, le nom symbolique comme EACCES ou ENOENT, ou même un mot du message attrapé au vol, et vous récupérez le symbole, ce que ça veut vraiment dire, les deux ou trois trucs qui le déclenchent d'habitude, et comment diagnostiquer avec perror, strerror, strace et dmesg. Un filtre par catégorie sépare les codes permission, fichiers, processus, mémoire, arguments et réseau quand vous préférez parcourir. Chaque numéro est la valeur Linux officielle, d'EPERM jusqu'au jeu glibc courant. Tout tourne en local dans votre navigateur ; rien de ce que vous tapez ne quitte la page, et la recherche continue de marcher même hors ligne.
100% dans votre navigateur. Rien de ce que vous tapez ne quitte cette page.
Référence errno Linux · numéros, noms et correctifs
Un syscall a planté et tout ce qu'on vous renvoie, c'est un numéro tout sec, du genre errno 13 ou -EACCES dans un log ? Tapez le numéro ou le nom symbolique, même un mot du message attrapé au vol. Vous récupérez le symbole, ce que ça veut vraiment dire, les deux ou trois trucs qui le déclenchent d'habitude, et la façon dont je m'y prendrais pour diagnostiquer, du bon appel perror au lookup errno <n> de moreutils. strace et dmesg ont aussi leur mot à dire. Cliquez sur n'importe quelle entrée pour ouvrir le détail complet. Un filtre par catégorie attend sous la barre de recherche quand vous préférez parcourir, disons, seulement les codes réseau. Tout ça, c'est du JavaScript local ; rien de ce que vous tapez ne sort de la page.
Ce qu'est vraiment errno
Sous Linux, et sur à peu près tous les Unix, quand un appel système ou une fonction de la lib C échoue, il renvoie -1 (ou un pointeur null) et planque la vraie raison dans un entier thread-local qui s'appelle errno. Le numéro tout seul ne vous apprend presque rien. Le noyau ne va pas vous afficher "tu peux pas écrire ici parce que le système de fichiers est en lecture seule", il met juste errno à 30 et passe à la suite. Votre boulot, c'est de retransformer ce 30 en EROFS, puis en correctif. C'est tout l'intérêt de cette page.
Les valeurs ne sont pas tirées au hasard, d'ailleurs. Les petites (1 à 34) viennent de asm-generic/errno-base.h et sont stables sur quasiment tous les Unix, donc ENOENT vaut 2 sous Linux, sous macOS, sur les BSD. Au-dessus de 34, elles sont définies dans asm-generic/errno.h et là, les numéros commencent à diverger d'un OS à l'autre. Les codes réseau surtout : ECONNREFUSED vaut 111 sous Linux mais un numéro complètement différent sous macOS. Donc chaque numéro de cette page est la valeur Linux. Ne les recopiez pas sur un Mac en vous attendant à ce que ça colle.
Où on tombe sur errno
- En C, après le moindre échec d'un wrapper libc ou syscall. Vous incluez
<errno.h>, vous lisez leerrnoglobal, et vous le transformez en texte avecperror("open")oustrerror(errno). - Dans le shell, le code de sortie
$?n'est pas l'errno, mais une commande qui échoue affiche souvent la chaîne strerror ("No such file or directory"), qui n'est rien d'autre queENOENTen clair. - Dans la sortie de strace, c'est là qu'on le voit brut : une ligne comme
openat(...) = -1 ENOENT (No such file or directory)vous donne le syscall, le symbole et le message d'un coup. Honnêtement, c'est le moyen le plus rapide de trouver quel appel a planté et pourquoi. - En Python, un appel OS qui échoue lève une
OSError(ou une sous-classe commePermissionError,FileNotFoundError), et l'attribut.errnocontient le numéro.import errno; errno.EACCESvous donne les constantes symboliques. - Dans les logs noyau, les drivers et la couche bloc loguent souvent la forme négative, donc vous verrez
-5pourEIOou-110pourETIMEDOUTdansdmesg.
Comment en chercher un vite fait
Si vous avez moreutils d'installé, le plus rapide c'est errno 13, qui affiche EACCES 13 Permission denied, et errno -l balance la liste entière. Pas de moreutils ? Un one-liner fait l'affaire : python3 -c 'import os,errno; print(os.strerror(13))', ou en Perl perl -e 'print $!=13,"\n"'. En C c'est perror() pour l'errno courant ou strerror(n) pour n'importe quelle valeur. Et la source de vérité canonique, si jamais vous doutez d'un numéro, c'est le header lui-même : grep -rE "EACCES|13" /usr/include/asm-generic/errno*.h. La page de man man 3 errno les liste aussi, avec les descriptions.
Pièges classiques
Celui qui piège tout le monde : errno n'a de sens que juste après un échec. Un appel qui réussit ne le remet pas à zéro. Donc si vous regardez errno après un appel qui a en fait réussi, vous lisez peut-être une vieille valeur datant de trois appels plus tôt. La règle : vérifiez d'abord la valeur de retour, et seulement après, regardez errno. Mettez-le vous-même à 0 avant un appel si vous avez vraiment besoin de distinguer "pas d'erreur" de "erreur".
Deux autres que je vois tout le temps. EAGAIN et EWOULDBLOCK sont le même numéro sous Linux (11), donc un code qui teste les deux fait juste dans le portable, pas dans le paranoïaque. Et EINTR (4) n'est pas vraiment une erreur, c'est un syscall interrompu par un signal, et le bon réflexe est presque toujours de relancer l'appel plutôt que d'abandonner. Plein de bugs, c'est juste quelqu'un qui traite EINTR comme fatal.
Comment tourne cet outil
Tout le jeu de données errno se trouve directement dans la page et la recherche tourne en local, en pur JavaScript. Vos recherches restent sur votre machine, point. Et une fois chargée, la page continue de marcher même hors ligne.
Questions fréquentes
Ça veut dire quoi, errno 13 ?
Errno 13, c'est EACCES, "Permission denied". Le processus n'a pas les droits pour faire ce qu'il a demandé. Un fichier qu'il ne peut pas écrire, par exemple, ou un port bas où il ne peut pas se binder. Vérifiez le mode et le propriétaire du fichier avec ls -l, vérifiez que vous pouvez traverser chaque répertoire parent (il vous faut l'exécution, le bit x, sur chacun), et n'oubliez pas que SELinux ou AppArmor peuvent refuser l'accès même quand les permissions Unix de base ont l'air nickel. strace vous montre le syscall et le chemin exacts qui ont été refusés.
Quelle différence entre errno et le code de sortie shell $? ?
Ce ne sont pas la même chose. errno, c'est la raison au niveau C pour laquelle un syscall a échoué, un entier thread-local comme 2 pour ENOENT. Le $? du shell, c'est le code de sortie de tout un processus, de 0 à 255, fixé par la valeur que le programme a passée à exit(). Un programme peut tomber sur ENOENT en interne, puis choisir de sortir avec le code 1, ou 2, ou n'importe quoi. Il n'y a aucune correspondance fixe entre les deux. errno explique pourquoi un appel précis a échoué. $? vous dit seulement comment le programme dans son ensemble a choisi de se terminer.
Comment convertir un numéro errno en son nom en Python ?
Utilisez le module errno pour le nom et os.strerror pour le message. import errno, os; print(errno.errorcode[13], os.strerror(13)) affiche "EACCES Permission denied". Quand un appel OS échoue, Python lève une OSError (ou une sous-classe), et l'attribut .errno de l'exception contient le numéro, donc vous pouvez brancher directement sur if e.errno == errno.ENOENT.
Pourquoi je vois un errno négatif comme -110 dans dmesg ou les logs noyau ?
À l'intérieur du noyau, les fonctions renvoient les erreurs sous forme de nombres négatifs, donc -110 c'est ETIMEDOUT et -5 c'est EIO. C'est une convention noyau : un appel qui réussit renvoie 0 ou une valeur positive, un échec renvoie l'errno avec le signe inversé. Quand cette erreur remonte vers l'espace utilisateur à travers un syscall, la lib C rétablit le signe et range la valeur positive dans errno. Donc -5 dans dmesg et errno 5 dans votre programme, c'est le même EIO.
Les numéros errno Linux sont-ils les mêmes que sous macOS ou BSD ?
Les 34 premiers correspondent (ENOENT vaut 2 partout, EACCES vaut 13 partout), parce qu'ils viennent de la même base historique. Au-dessus de 34 ça diverge, et les codes réseau sont les pires fautifs. ECONNREFUSED vaut 111 sous Linux mais 61 sous macOS, ETIMEDOUT vaut 110 sous Linux mais 60 sous macOS. Le nom symbolique est portable ; le numéro, lui, non. Si votre code passe d'une plateforme à l'autre, comparez à la constante plutôt qu'à un entier en dur.
Faut-il traiter EINTR comme une erreur fatale ?
Non, et le traiter comme fatal est un bug classique. EINTR (errno 4) signifie qu'un signal est arrivé pendant que votre appel était bloqué, donc le noyau a interrompu l'appel en cours de route. Les données sont intactes et rien n'est cassé ; vous devez juste relancer l'appel. Plein de code enveloppe les appels bloquants dans une boucle de retry exactement pour ça. Linux peut redémarrer automatiquement certains appels si vous positionnez SA_RESTART sur le handler de signal, mais vous ne pouvez pas compter dessus pour tout, donc gérez EINTR explicitement.