Dans un programme C, si nous voulons donner une entrée à partir du terminal, nous pouvons la donner par:
int main(int argc, char *argv[])
De la même manière, si nous voulons obtenir la valeur de retour de la fonction main()
, comment pouvons-nous l'obtenir?
Dans chaque main()
nous écrivons return 1
Ou return 0
; comment savoir ce que ma main()
a retourné au terminal?
Modifier: 1
Je comprends que par echo $?
Nous pouvons obtenir la valeur de retour de main()
mais cela me permet seulement de retourner une valeur inférieure à 125 (sous Linux) avec succès. Une valeur de retour supérieure à celle-ci ne peut pas être reçue avec succès par le $ variable
Donc
pourquoi int
est le type de retour de main()
? Pourquoi ne pas le conserver short int
?
Edit2
D'où puis-je trouver la signification du code d'erreur si main()
renvoie une valeur supérieure à 125?
La plupart des shells stockent le code de sortie de la commande d'exécution précédente dans $?
pour pouvoir le stocker ou l'afficher.
$ ./a.out
$ echo $? # note - after this command $? contains the exit code of echo!
ou
$ ./a.out
$ exit_code=$? # save the exit code in another Shell variable.
Notez que sous linux, bien que vous retourniez un int
, généralement seules les valeurs inférieures à 126 sont sûres à utiliser. Des valeurs plus élevées sont réservées pour enregistrer d'autres erreurs susceptibles de se produire lors de la tentative d'exécution d'une commande ou pour enregistrer le signal, le cas échéant, qui a mis fin à votre programme.
Votre Shell a probablement une variable spéciale $?
, qui contient la dernière valeur renvoyée par le programme. Donc, peu de temps après la fin de votre programme, vous pouvez exécuter:
echo $?
pour voir la valeur retournée.
Sous DOS/Windows, vous pouvez utiliser errorlevel
dans un fichier batch
executable optional arguments
if errorlevel 4 goto LABEL4
if errorlevel 3 goto LABEL3
if errorlevel 2 goto LABEL2
if errorlevel 1 goto LABEL1
:SUCCESS
echo SUCCESS; errorlevel 0
goto :eof
:LABEL1
echo FAILURE; errorlevel 1
goto :eof
:LABEL2
echo FAILURE; errorlevel 2
goto :eof
REM ...
N'oubliez pas de vérifier du plus grand au plus bas car if errorlevel 42
signifie vraiment "si le niveau d'erreur est de 42 ou plus"
Résumant les commentaires et les morceaux pour qu'ils soient au même endroit.
Le programme AC a toujours un code de sortie , que le programme peut décider lui-même s'il se termine normalement, en renvoyant une valeur à partir de main
ou en appelant la fonction exit
. Si le programme se termine anormalement, par exemple par un défaut de segmentation, le système d'exploitation décide du code de sortie.
Sous Unix (Posix), le code de sortie est une valeur de 8 bits: 0-255. Elle est combinée avec d'autres métadonnées à un état : les autres métadonnées incluent des informations sur le fait que le programme s'est terminé normalement ou non, s'il a été arrêté à cause d'un signal, et si oui, quel signal. Pour plus de détails, consultez la page de manuel wait (2) .
Sous Unix, sur le Shell, l'état de la commande précédente est accessible en tant que $?
variable spéciale. Étant donné que le code de sortie n'est que de 8 bits et qu'il est traité comme un entier non signé, si vous renvoyez une valeur négative, il devient un positif: -1 devient 255. De même, si vous ne renvoyez une valeur supérieure à 255 que le moins 8 bits significatifs sont utilisés: 256 devient 0.
Le type de retour de main
est int
, plutôt que short
ou char
, car il n'y a aucun avantage particulier à en faire un type plus petit, en particulier à ce stade dans l'histoire, des décennies après sa décision. Le changer maintenant ne causerait que des complications inutiles.
Si vous souhaitez exécuter un programme à partir de C, la bibliothèque standard fournit la fonction system
, qui retourne facilement l'état du programme. (Notez que system
exécute des commandes via le shell, et vous devez faire très attention à ne pas tout échapper correctement si vous donnez à la commande des noms de fichiers fournis en externe ou d'autres choses sur la ligne de commande.)
Pour plus de flexibilité, vous pouvez exécuter d'autres programmes en utilisant les appels système fork
, execl
(ou l'une de ses variantes, voir la page de manuel exec (3) ), et wait
(déjà mentionné ci-dessus). C'est puissant et flexible, mais il est également facile de faire des erreurs, alors assurez-vous de lire la documentation et de consulter d'abord quelques exemples de programmes. (D'un autre côté, c'est très amusant d'apprendre ce genre de choses.)
Vous pouvez obtenir les valeurs de sortie avec la commande basique echo $? Les codes d'erreur sont standard et les détails sont expliqués dans ce lien
Les codes généraux sont
**
0- succès
1- Erreurs générales
126- problème d'autorisation
127-Commande illégale
128-Arguments invalides et erreurs fatales
255-Hors de portée **