GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Les valeurs minimales et maximales des codes de sortie sous Linux ?

Quelles sont les valeurs min et max des codes de sortie suivants sous Linux :

  1. Le code de sortie renvoyé par un exécutable binaire (par exemple :un programme C
    ).
  2. Le code de sortie renvoyé par un script bash (lors de l'appel de exit ).
  3. Le code de sortie renvoyé par une fonction (lors de l'appel de return ). Je
    pense que c'est entre et 255 .

Réponse acceptée :

Le numéro passé à _exit() /exit_group() appel système (parfois appelé code de sortie pour éviter l'ambiguïté avec statut de sortie qui fait également référence à un encodage du code de sortie ou du numéro de signal et des informations supplémentaires selon que le processus a été tué ou quitté normalement) est de type int , donc sur les systèmes de type Unix comme Linux, généralement un entier 32 bits avec des valeurs comprises entre -2147483648 (-2) et 2147483647 (2-1).

Cependant, sur tous les systèmes, lorsque le processus parent (ou le sous-moissonneur enfant ou init si le parent est décédé) utilise le wait() , waitpid() , wait3() , wait4() appels système pour le récupérer, seuls les 8 bits inférieurs sont disponibles (valeurs 0 à 255 (2-1)).

Lors de l'utilisation de waitid() API (ou un gestionnaire de signal sur SIGCHLD), sur la plupart des systèmes (et comme POSIX l'exige maintenant plus clairement dans l'édition 2016 de la norme (voir _exit() spécification)), le numéro complet est disponible (dans le si_status champ de la structure renvoyée). Ce n'est pas encore le cas sous Linux, qui tronque également le nombre à 8 bits avec le waitid() API, bien que cela soit susceptible de changer à l'avenir.

Généralement, vous ne voudrez utiliser que les valeurs 0 (signifiant généralement le succès) à 125 uniquement, car de nombreux shells utilisent des valeurs supérieures à 128 dans leur $? représentation du statut de sortie pour encoder le numéro de signal d'un processus en cours de suppression et 126 et 127 pour des conditions spéciales.

Vous pouvez utiliser 126 à 255 sur exit() pour signifier la même chose que pour le $? du shell (comme quand un script fait ret=$?; ...; exit "$ret" ). L'utilisation de valeurs en dehors de 0 -> 255 n'est généralement pas utile. Vous ne feriez généralement cela que si vous savez que le parent utilisera le waitid() API sur les systèmes qui ne tronquent pas et vous avez besoin de la plage de valeurs 32 bits. Notez que si vous faites un exit(2048) par exemple, cela sera considéré comme un succès par les parents utilisant le traditionnel wait*() API.

Plus d'informations sur :

  • Code de sortie par défaut lorsque le processus est terminé ?

Ces questions-réponses devraient, espérons-le, répondre à la plupart de vos autres questions et clarifier ce que l'on entend par statut de sortie . J'ajouterai quelques éléments :

Un processus ne peut pas se terminer à moins d'être tué ou d'appeler le _exit() /exit_group() appels système. Lorsque vous revenez de main() en C , la libc appelle cet appel système avec la valeur de retour.

La plupart des langages ont un exit() fonction qui encapsule cet appel système et la valeur qu'elle prend, le cas échéant, est généralement transmise telle quelle à l'appel système. (notez que ceux-ci font généralement plus de choses comme le nettoyage effectué par exit() de C fonction qui vide les tampons stdio, exécute le atexit() crochets…)

En relation:Linux - Comment réutiliser Ubuntu APT ?

C'est le cas d'au moins :

$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234)                        = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234)                        = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234)                        = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)

Vous en voyez parfois qui se plaignent lorsque vous utilisez une valeur en dehors de 0-255 :

$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1)                           = ?

Certains shells se plaignent lorsque vous utilisez une valeur négative :

$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2)                           = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2)                           = ?

POSIX laisse le comportement indéfini si la valeur est passée à la exit special builtin est en dehors de 0->255.

Certains shells affichent des comportements inattendus si vous le faites :

  • bash (et mksh mais pas pdksh sur laquelle il se base) se charge de tronquer la valeur à 8 bits :

    $ strace -e exit_group bash -c 'exit 1234'
    exit_group(210)                         = ?
    

    Donc, dans ces shells, si vous voulez sortir avec une valeur en dehors de 0-255, vous devez faire quelque chose comme :

    exec zsh -c 'exit -- -12345'
    exec perl -e 'exit(-12345)'
    

    C'est exécuter une autre commande dans le même processus qui peut appelez l'appel système avec la valeur que vous voulez.

  • comme mentionné à cet autre Q&A, ksh93 a le comportement le plus étrange pour les valeurs de sortie de 257 à 256 + max_signal_number où au lieu d'appeler exit_group() , il se tue avec le signal correspondant¹.

    $ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    zsh: suspended (signal)  ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    

    et sinon tronque le nombre comme bash /mksh .


Linux
  1. La commande Linux Sed :utilisation et exemples

  2. Comment vérifier la version du système d'exploitation et de Linux

  3. Trouvez les fichiers et répertoires les plus volumineux sous Linux

  4. Ny Way pour connaître la taille du cache L1, L2, L3 et Ram sous Linux?

  5. Comment installer et utiliser la commande Ping sous Linux

Quelle est la différence entre Linux et Unix ?

Les 5 meilleures distributions Linux pour les développeurs et les programmeurs

Surveillance et test de la santé du SSD sous Linux

Comment trouver le PID et le PPID d'un processus sous Linux

Un gars Windows dans un monde Linux :YaST et le bureau

Linux perf :comment utiliser la commande et le profileur