Historique Unix: code de retour octal?

10

J'ai été renversé aujourd'hui par gdb:

Program exited with code 0146.

gdbimprime le code retour en octal ; en cherchant pourquoi j'ai trouvé: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Mais ce n'est pas une réponse particulièrement satisfaisante. Une recherche rapide sur Google n'a pas révélé l'histoire, alors j'espérais que quelqu'un sur SO connaîtrait l'histoire.

Une question quelque peu connexe, comment pourrait-on même voir le code de retour en octal? Peut-être que les machines plus anciennes imprimaient toujours le code retour?

$ printf %o\\n $?

Est assez maladroit :)

Tapoter
la source
la $?est la valeur de shell pour le code de retour, et est un chiffre décimal (ou pris en charge par votre exemple gdb cmd aussi?). Je ne sais pas pourquoi gdb le signale en octal. Ma solution est de sortir le 'ol man asciipour voir ce que signifient les valeurs octales. Question intéressante, car vous rencontrez également des valeurs octales provenant d'autres programmes. Peut-être que cela est discuté dans Kernighan et Pike's 'Unix Programming Envioronment'. Bonne chance.
shellter
Le statut de sortie peut être supérieur à un chiffre, c'est en fait un octet. Il man asciiserait également inutile de convertir l'octal en décimal. bcserait un meilleur choix.
jlliagre
2
Le code retour est un nombre , non décimal ou octal. Le programme renvoie un état (un octet). Avec wait (3) ou sa tribu, le processus parent peut trouver beaucoup d'informations sur la raison pour laquelle le processus s'est arrêté (normalement, c'est-à-dire volontairement en appelant exit (2); tué par un signal, ...)
vonbrand

Réponses:

6

La représentation octale facilite l'interprétation du code de sortie pour les petites valeurs, qui sont les plus couramment utilisées. Si ce nombre, qui est un octet, était imprimé en décimal, trouver quel signal a interrompu un processus nécessiterait un peu de calcul en octal, ils peuvent être lus tels quels:

  • un processus se termine avec le statut 5, gdbs'affiche, 05ce qui ne fait aucune différence
  • un processus se termine parce qu'il a un SIGINT( Control+ C), un gdbaffichage 0202qui est plus facile à reconnaître que le signal n ° 2 130.

De plus, le statut de sortie peut également être un masque de bits et dans ce cas, octal (au moins lorsque vous y êtes habitué, ce qui était plus courant il y a quelques décennies que de nos jours) est plus facile à convertir mentalement en bits qu'en décimal ou même hexadécimal, comme par exemple chmodencore accepter un nombre octal pour représenter les autorisations de fichier: 0750 = 111 101 000 = rwx r-x ---.

jlliagre
la source
probablement le mauvais endroit pour poser cette question, mais existe-t-il un moyen facile de savoir si un nombre donné par GDB est en octal ou en décimal?
marinara
3
La convention est que si elle commence par zéro (0), elle est octale.
jlliagre
3

Je n'ai pas de copie de ce texte et je viens de lire le court texte descriptif disponible sur Google Books mais. Selon le guide de portabilité X / Open System V Specification Commands & Utilities pg 283 (selon Google Books)

si une application se termine de manière anormale, son état de sortie est octal 0200 + status, et il existe une liste de valeurs communes de «status» (qui sont probablement également données en octal).

C'est donc / était un mauvais message d'erreur.


la source