2010-09-17 57 views
20

Je suis en train de retourner une valeur plus comme 1000 de ma fonction principale, mais quand je tape echo $? il affiche 0.Pourquoi ne puis-je pas renvoyer des valeurs plus grandes à partir de la fonction principale?

Si je retourne une valeur plus petite comme 100 il affiche la valeur correcte.

Mon code:

int main(void) 
{ 
    return 1000; 
} 

est-il des limites sur les valeurs que nous pouvons revenir?

+0

Je reçois ** 232 ** pour 'return 1000;' et ** 233 ** pour 'return 1001;' – Lazer

+5

** 1000% 256 = 232 ** – Lazer

Répondre

22

Il y a deux concepts liés ici: C exit status, et bash return code. Ils couvrent tous deux la plage 0-255, mais bash utilise des nombres supérieurs à 126 pour ses propres besoins, il serait donc déroutant de renvoyer ceux de votre programme. Pour être sûr de limiter les codes d'état de sortie à 0-127, comme c'est le plus portable, au moins cela est impliqué par http://docs.python.org/library/sys.html#sys.exit.

Le statut de sortie C est mis dans le bash $? variable après l'exécution, mais bash utilise 127 pour indiquer 'command not found' donc vous pouvez éviter cela. Bash reference page. Bash utilise aussi 128-255 pour les signaux - ils indiquent que le processus a été tué avec un signal: exit code = 128 + signal number. Donc, vous pourriez être en mesure de s'en tirer en utilisant des nombres proches de 255 car il est peu probable que les numéros de signal iront aussi haut. Au-delà de ces lignes directrices communes, il existe de nombreuses tentatives pour définir ce que les différents nombres devraient signifier: http://tldp.org/LDP/abs/html/exitcodes.html.

Donc, si vous voulez renvoyer un entier arbitraire de votre programme, il est probablement préférable de l'imprimer sur stdout, et de le capturer avec VALUE=$(program) à partir de votre script bash.

+0

Je crois que la plage est 0-255 (c.-à-d. gamme de 'uint8_t') sur les systèmes * NIX - pas familier avec les systèmes avec une valeur maximale de 127 (ce qui impliquerait un type de retour signé équivalent à' int8_t', mais cela impliquerait également une limite inférieure de -128.) –

+0

+1 Merci pour l'explication:) – Searock

+0

En plus d'indiquer une plage incorrecte (comme l'a noté @Jonathan), vous semblez également confondre le statut de sortie du programme (reporté par 'waitpid (2)') et l'état de sortie de la commande shell (comme rapporté par '$?'). "128-255 sont utilisés pour les signaux" ne s'applique qu'à ce dernier. –

3

La valeur de retour de main (c'est-à-dire le statut de sortie de l'application) est limitée à la plage [0, 255] sur * NIX. 1000 est hors de portée, et l'OS le traite comme 0, vraisemblablement.

+2

Non, au moins dans bash, un statut de sortie supérieur à 255 renvoie la valeur modulo 256. 1000 retournera 232 –

+0

C'est ce que je suppose, basé sur la façon dont C gère les nombres, mais l'OP dit qu'il obtient 0 comme résultat. –

1

Dans la zone Unix, la valeur de retour de main est limitée car exit est limitée à la plage d'un octet de 8 bits.

Sous Windows, il existe une seule valeur, STILL_ACTIVE avec la valeur 259, qu'il vaut mieux éviter comme code de sortie de processus. En dehors de cela, dans Windows, vous pouvez renvoyer un code 32 bits tel qu'un HRESULT et cela est généralement effectué.