web-dev-qa-db-fra.com

Comment puis-je obtenir ce que ma fonction principale a renvoyé?

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?

65
Jeegar Patel

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.

50
CB Bailey

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.

40
sidyll

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"

31
pmg

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.)

6
user25148

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 **

3
Shameerariff