Signification de 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 ne trouve pas de réponse définitive, alors j’ai pensé poser la question ici. Cela vient lorsque j’essaie d’append un élément à un vecteur.

Vous n’avez pas trouvé de réponse définitive car il n’y en a pas. Il appartient à l’auteur du programme de décider des codes de sortie qu’il souhaite utiliser. Le standard C indique uniquement que exit(0) ou exit(EXIT_SUCCESS) indique que le programme a réussi et que exit(EXIT_FAILURE) indique une erreur quelconque. (Renvoyer une valeur de main équivaut à l’ exit appelant avec cette valeur.) La plupart des systèmes d’exploitation courants, notamment Windows, Linux, OSX, etc. utilisent 0 pour succès et les valeurs de 1 à 255 pour indiquer les erreurs. toujours choisir entre les codes d’erreur, c’est au rédacteur de l’application, la valeur 11 n’a rien de spécial.

Sous Linux et la plupart des variantes Unix, le signal numéro 11 indique une erreur de segmentation , comme le remarque Kerrek SB . Une erreur de segmentation se produit lorsqu’un programme crée un type d’access mémoire non valide. Il s’agit donc d’une conséquence plausible de l’access à un tableau en dehors des limites, d’une erreur d’arithmétique de pointeur, d’une tentative d’access à un pointeur null ou d’autres erreurs liées au pointeur. Le signal 11 n’est pas la même chose que le code de sortie 11: quand un programme meurt à cause d’un signal, il est marqué comme ayant été tué par un signal, plutôt que de s’être arrêté normalement. Les shells Unix signalent les signaux en signalant un code de sortie qui est le numéro du signal plus 128, donc 139 pour un défaut de segmentation.

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 de statut récupéré avec la famille d’attente d’appels système, 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 verrez peut-être “code de sortie 11” si le processus fils segfaults. Si le processus enfant appelle réellement exit(11) vous verrez peut-être «code de sortie 2816».

Il serait préférable d’appeler ces choses “code d’attente” ou “statut d’attente” au lieu de “code de sortie”, pour éviter toute confusion avec la valeur transmise à quitter. Un code d’attente contient plusieurs informations regroupées dans un seul entier. Normalement, vous ne devriez pas regarder directement le nombre entier (comme je l’ai fait plus haut dans cette printf ). Vous devriez plutôt utiliser les macros W* de pour l’parsingr.

Commencez par les macros WIF* pour déterminer le type de problème, puis utilisez ces informations pour choisir les 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 */ } 

Il n’y a pas de norme définie pour les codes de sortie qu’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 quel succès!

Parfois, les programmeurs décident que toute valeur différente de zéro signale une erreur et que, parfois, cette valeur équivaut aux codes d’erreur du système d’exploitation.

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