code retour main()

code retour main() - C - Programmation

Marsh Posté le 16-04-2009 à 13:46:11    

Bonjour,
 
Je souhaite écrire un petit programme me permettant de me relire une valeur qui peut être comprise entre 0 et 1FFF pour ensuite l'utiliser dans un shell-script.
 
Malheureusement, je viens de découvrir que le code retour d'un exécutable linux ne peut pas dépasser 255. Je suis d'autant plus étonné que le type de retour de main est un int.
 

Code :
  1. int main() {
  2. return 257;
  3. }


 
me donne :  

Code :
  1. # echo $?
  2. # 1


 
Pour quelle raison cette limitation ?  Et y-a-t-il un moyen de l'outrepasser ?
 
Merci :jap:

Reply

Marsh Posté le 16-04-2009 à 13:46:11   

Reply

Marsh Posté le 16-04-2009 à 14:01:42    

Ca dépend du système et du shell. D'habitude, tu récupères 8bits, signé ou pas, selon. Faut pas trop s'appuyer dessus pour des grosses valeurs.

Reply

Marsh Posté le 16-04-2009 à 14:18:39    

Pour récupérer plus d'informations, une solution consiste à écrire dans un fichier, ou vers la sortie standard, ce qui est assez pratique si on utilise un pipe ensuite.
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
  /* Ecrire sur la sortie standard  
     (pas la peine d'ouvrir ou de fermer "stdout" ) */
  fprintf(stdout, "12345" );
 
  return(0);
}

Reply

Marsh Posté le 16-04-2009 à 14:32:58    

xilebo a écrit :

Malheureusement, je viens de découvrir que le code retour d'un exécutable linux ne peut pas dépasser 255.
 
Pour quelle raison cette limitation ?


 
la man page POSIX de exit() contient

Citation :

The value of status may be 0, EXIT_SUCCESS, EXIT_FAILURE, or any other value, though only the least significant 8 bits (that is, status & 0377) shall be available to a waiting parent process.


Reply

Marsh Posté le 16-04-2009 à 14:35:55    

très bien. Je n'ai pas pensé à regarder la page man de la fonction exit().
 
 
Je vais donc utiliser une autre méthode, comme celle qu'indique olivthill, bien que je trouve ça dangereux.
 
 
Merci des infos :)

Reply

Marsh Posté le 16-04-2009 à 14:45:51    

dangereuse voire terroriste.

Reply

Marsh Posté le 16-04-2009 à 15:04:28    

xilebo a écrit :

Bonjour,

 

Je souhaite écrire un petit programme me permettant de me relire une valeur qui peut être comprise entre 0 et 1FFF pour ensuite l'utiliser dans un shell-script.

 

Malheureusement, je viens de découvrir que le code retour d'un exécutable linux ne peut pas dépasser 255. Je suis d'autant plus étonné que le type de retour de main est un int.
<...>
Pour quelle raison cette limitation ?  Et y-a-t-il un moyen de l'outrepasser ?


256 valeurs pour un shell c'est largement suffisant pour prendre des décisions (dans la pratique, c'est 0(OK) ou 1(ERREUR) ). Si tu as besoin de retourner une valeur précise (texte), utilise un fichier texte. Il pourra alors être relu par l'application qui en a besoin.

 

Tu peux aussi sortir la valeur par stdout et la récupérer directement par stdin d'une autre application en utilisant le 'pipe' (généralement '|' dans les systèmes courants...)

 

Usage classique sous MS-DOS :

type file.txt | more


Message cité 1 fois
Message édité par Emmanuel Delahaye le 17-04-2009 à 00:58:37

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-04-2009 à 21:31:07    

Emmanuel Delahaye a écrit :


256 valeurs pour un shell c'est largement suffisant pour prendre des décisions (dans la pratique, c'est 0(OK) ou 1(ERREUR) ). Si tu as besoin de retourner une valeur précise (texte), utilise un fichier texte. Il pourra alors être relu par l'application qui en a besoin.
 
Tu peux aussi sortir la valeur par stdout et la récupérer directement par stdin d'une autre application en utilisant le 'pipe' (généralement '|' dans les systèmes courants...)
 
Usage classique sous MS-DOS :  

type file.txt | more




 
Je trouvais ça dommage de devoir créer un fichier temporaire pour récupérer une valeur temporaire. J'ai donc utilisé la sortie standard, et blindé mon script au cas où je n'ai pas le format de valeur attendu.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed