web-dev-qa-db-fra.com

Signification du code de sortie 11 en C?

Quelle est la signification générale d'un code de sortie 11 en C? J'ai regardé autour de moi et je ne trouve pas de réponse définitive, alors j'ai pensé que je demanderais ici. Cela vient quand j'essaye d'ajouter un élément à un vecteur.

13
user3593148

Vous n'avez pas trouvé de réponse définitive car il n'y en a pas. C'est à l'auteur du programme de décider quels codes de sortie il souhaite utiliser. La norme C indique uniquement que exit(0) ou exit(EXIT_SUCCESS) indiquent que le programme a réussi et que exit(EXIT_FAILURE) indique une erreur quelconque. (Le renvoi d'une valeur à partir de main équivaut à appeler exit avec cette valeur.) La plupart des systèmes d'exploitation courants, y compris Windows, Linux, OSX, etc. utilisent 0 pour réussir et les valeurs de 1 à 255 à indiquer des erreurs; le choix entre les codes d'erreur dépend de l'auteur de l'application, la valeur 11 n'a rien de spécial.

Sous Linux et la plupart des autres variantes Unix, le signal numéro 11 indique un défaut de segmentation , comme remarqué par Kerrek SB . Une erreur de segmentation se produit lorsqu'un programme effectue une sorte d'accès à la mémoire non valide, c'est donc une conséquence plausible de l'accès à un tableau hors limites, ou d'une erreur dans l'arithmétique du pointeur, ou d'essayer d'accéder à un pointeur nul ou à d'autres erreurs liées au pointeur. Le signal 11 n'est pas la même chose que le code de sortie 11: lorsqu'un programme meurt à cause d'un signal, il est marqué comme ayant été tué par un signal, plutôt que d'être sorti normalement. Les shells Unix signalent des signaux en signalant un code de sortie qui est le numéro de signal plus 128, donc 139 pour un défaut de segmentation.

11
Gilles

Les autres réponses ont manqué une ambiguïté possible dans l'expression "code de sortie". Je soupçonne que ce que vous entendiez par "code de sortie" est le code d'état récupéré avec la famille de syscalls wait, comme dans:

/* assume a child process has already been created */
int status;
wait(&status);
printf("exit code %d\n", status);

Si vous faites quelque chose comme ça, vous pouvez très voir "code de sortie 11" si le processus enfant se sépare. Si le processus enfant a effectivement appelé exit(11), vous pouvez voir "code de sortie 2816" à la place.

Il serait préférable d'appeler ces choses "code d'attente" ou "état d'attente" au lieu de "code de sortie", pour éviter toute confusion avec la valeur passée à exit. Un code d'attente contient plusieurs informations regroupées en un seul entier. Normalement, vous ne devriez pas regarder directement l'entier (comme je l'ai fait ci-dessus dans ce printf). Vous devriez plutôt utiliser les macros W* De <sys/wait.h> Pour l'analyser.

Commencez par les macros WIF* Pour découvrir ce qui s'est passé kind, puis utilisez ces informations pour décider quelles autres macros W* Utiliser pour obtenir les détails.

if(WIFEXITED(status)) {
  /* The child process exited normally */
  printf("Exit value %d\n", WEXITSTATUS(status));
} else if(WIFSIGNALED(status)) {
  /* The child process was killed by a signal. Note the use of strsignal
     to make the output human-readable. */
  printf("Killed by %s\n", strsignal(WTERMSIG(status)));
} else {
  /* ... you might want to handle "stopped" or "continued" events here */
}
5
user2404501

Il n'y a pas de norme définie quels codes de sortie une application doit définir dans certaines situations. C'est au programmeur de décider quels codes de sortie représentent quelle erreur ou même succès!

Parfois, les programmeurs décident que toute valeur différente de zéro signale une erreur, et parfois cette valeur est égale aux codes d'erreur des systèmes d'exploitation.

Sous Windows, le code de sortie 11 pourrait être utilisé en raison de problèmes avec un fichier. Si vous voulez la description de ce code d'erreur (qui est spécifique à Windows et pas nécessairement à votre application) exécutez net helpmsg 11.

0
Marged