IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Valeur retourné par un script shell dans un programme C


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur Java
    Inscrit en
    Janvier 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2008
    Messages : 42
    Points : 34
    Points
    34
    Par défaut Valeur retourné par un script shell dans un programme C
    Bonjour tt le monde,

    J'ai un petit problème au niveau de la valeur retourné d'un script shell dans un programme C avec system, voici mon script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    cat fich1 | awk '$2 != "null" && ( $4 == "idle" || $4 == "printing" ) { printf "%-14.14s%-10.10s\n", $1, $2 } ' > /sfctrl/tmp/SpListDisp.txt
     
    ret=$?
    echo $ret
    if test $ret -ne 0
    then
        echo Error en la ejecuccion del proceso splist
        exit 99
    fi
     
    nbLinas=`cat /sfctrl/tmp/SpListDisp.txt | wc -l`
    if [ $nbLinas -eq 0 ]
    then
      echo No hay impresoras preparadas
      exit 1
    fi
     
    exit 0
    Donc la valeur retourné par le script est soit 0, 1 ou 99, mais voilà lors de la recuperation du retour dans le programme comme suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int iRet=0;
    ...
    iRet = system(szCmd);
    ....
    J'ai 256 si la valeur retourné est 1 !!!
    Comment pourrai-je récupérer la valeur exacte retourné par le script dans le programme C.

    Merci bq pour votre temps

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Il faut savoir que la variable $? du shell est codée sur 8 bits. Il me semble donc, en lisant ton pb, que le "1" passe du coté du poids fort de l'int ce qui donne 0x0100 soit 256

    C'est à vérifier bien sûr car ça ne correspond pas à ce qui est prévu. Essaye de remplacer, dans le script, 1 par 2 et retente. Si tu vois en final le nombre 512 c'est que c'est ça...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 41
    Points
    41
    Par défaut
    Tu dois utiliser le macro WEXITSTATUS(status) pour récupérer le code

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par argv225 Voir le message
    Tu dois utiliser le macro WEXITSTATUS(status) pour récupérer le code
    Ca c'est quand tu utilises wait(&s). La variable s récupère sur le bit de poids fort la valeur du exit() et sur le bit de poids faible la valeur du kill() selon le cas. Et la macro WEXITSTATUS() isole la valeur du exit. Mais cela m'étonne que ce soit le même comportement avec system() car le man dit bien que la fonction renvoie le code retour du programme et non un mix entre code retour et code d'interruption...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 41
    Points
    41
    Par défaut
    Mais si: man 3 system

    RETURN VALUE
    The value returned is -1 on error (e.g. fork failed), and the return
    status of the command otherwise. This latter return status is in the
    format specified in wait(2). Thus, the exit code of the command will
    be WEXITSTATUS(status)
    . In case /bin/sh could not be executed, the
    exit status will be that of a command that does exit(127).

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par argv225 Voir le message
    Mais si: man 3 system

    RETURN VALUE
    The value returned is -1 on error (e.g. fork failed), and the return
    status of the command otherwise. This latter return status is in the
    format specified in wait(2). Thus, the exit code of the command will
    be WEXITSTATUS(status)
    . In case /bin/sh could not be executed, the
    exit status will be that of a command that does exit(127).
    Ok, moi j'étais allé voir ce man http://www.linux-kheops.com/doc/man/.../system.3.html qui n'en parle pas.
    En plus j'y avais pensé en voyant le syptôme mais je m'étais dit "non, WEXITSTATUS c'est pour la variable récupérée par wait()"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ok, moi j'étais allé voir ce man http://www.linux-kheops.com/doc/man/.../system.3.html qui n'en parle pas.
    Dans ce cas, le mieux pour hikamovic c'est de consulter le manuel de son linux. On ne sait jamais peut être cela dépend de la version de sa distribution

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/07/2015, 14h55
  2. Réponses: 7
    Dernier message: 09/06/2011, 14h32
  3. Réponses: 3
    Dernier message: 09/06/2011, 14h22
  4. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  5. Réponses: 2
    Dernier message: 16/11/2007, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo