344 votes

Il n'existe aucun standard de sortie codes de statut dans Linux?

Un processus est considéré comme ayant complété correctement sous Linux si son état de sortie est de 0. J'ai vu que la segmentation des défauts souvent un statut de sortie de 11 ans, mais je ne sais pas si c'est simplement de la convention, où je travaille (les apps qui ont échoué comme qui ont tous été à l'interne) ou à une norme.

Sont là standard codes de sortie pour les processus dans Linux? Si oui, où puis-je trouver une liste?

364voto

Schof Points 2338

Partie 1: Advanced Bash Scripting Guide

Comme toujours, l' Advanced Bash Scripting Guide a grande information: (C'était lié à une autre réponse, mais non l'URL canonique.)

1: fourre-tout pour les erreurs générales
2: une mauvaise utilisation de la coquille objets internes (selon la documentation de Bash)
126: Commande invoquée ne peut pas exécuter
127: "command not found"
128: Invalid argument pour quitter
128+n: signal d'erreur Fatale "n"
255: statut de Sortie hors de portée (la sortie ne prend que entier args dans la gamme de 0 à 255)

Partie 2: sysexits.h

Le ABSG références sysexits.h.

Sur Linux:

$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h

/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.

 (A whole bunch of text left out.)

#define EX_OK           0       /* successful termination */
#define EX__BASE        64      /* base value for error messages */
#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

#define EX__MAX 78      /* maximum listed value */

92voto

ephemient Points 87003

8 bits de code de retour et les 8 bits du numéro de la mise à mort du signal sont mélangés dans une seule valeur sur le retour d' wait(2) & co..

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

Comment allez-vous déterminer le statut de sortie? Traditionnellement, la coque magasins à 8 bits de code de retour, mais définit le bit élevé si le processus a été arrêté anormalement.

$ sh -c 'sortie 42'; echo $?
42
$ sh -c 'kill-SEGV $$'; echo $?
Erreur de Segmentation
139
$ expr 139 - 128
11

Si vous voyez autre chose que cela, alors le programme a probablement un SIGSEGV gestionnaire de signal qui appelle exit normalement, donc il n'est pas réellement obtenir tué par le signal. (Programmes peuvent choisir de gérer tous les signaux hormis SIGKILL et SIGSTOP.)

74voto

segfault Points 2315

1 fourre-tout pour les erreurs générales

2 l'utilisation Abusive de la coquille objets internes (selon la documentation de Bash)

126 Commande invoquée ne peut pas exécuter

127 "command not found"

128 argument non Valide à la sortie

128+n signal d'erreur Fatale "n"

130 Script résilié par le Contrôle-C

255 statut de Sortie hors de gamme

C'est pour bash. Cependant, pour d'autres applications, il existe différents codes de sortie.

24voto

Chris Arguin Points 6469

Il n'existe pas de standard de codes de sortie, en dehors de 0, signifiant que le succès. Non-zéro n'est pas nécessairement synonyme d'échec.

stdlib.h ne définissent EXIT_FAILURE 1 et EXIT_SUCCESS 0, mais c'est tout.

Le 11 sur erreur de segmentation est intéressant, comme 11 est le numéro du signal que le noyau utilise pour tuer le processus dans le cas d'une erreur de segmentation. Il est probable qu'un certain mécanisme, que ce soit dans le noyau ou dans le shell, qui se traduit dans le code de sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X