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

Bibliothèque standard C Discussion :

Récupérer dans un programme C la valeur de retour d'un script shell


Sujet :

Bibliothèque standard C

  1. #1
    Membre habitué Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Points : 135
    Points
    135
    Par défaut Récupérer dans un programme C la valeur de retour d'un script shell
    Bonjour,

    Je sais que ce sujet a déjà fait l'objet de plusieurs post.
    Mais la réponse n'est hélas jamais claire!

    J'ai le script shell 'monshell' suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #!/bin/ksh
    ex=-1
    exit $ex
    Et j'ai le programme C suivant :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void
    main (void)
    {
            int rc, wrc;
     
            rc = system ("monshell"); 
            printf ("system returns %d", rc);
     
            wrc = WEXITSTATUS (rc);
            printf ("WEXITSTATUS returns %d", wrc);
     
            /* ex = ??? */
    }
    Si dans le script shell je fais varier la valeur de l'exit (par exemple, ex = -2, -1, 0, 1, ou 2), je ne réussis jamais à récupérer ces valeurs dans mon programme C !

    Comment faire pour récupérer la valeur de « ex » ?

    En fait, j'ai l'impression d'avoir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Si ex <  0
        rc = 65536 + 256 * ex
        wrc = 256 + ex
    Sinon
        rc = 256 * ex
        wrc = ex
    FinSi
    Mais alors comment récupérer la valeur de « ex » à partir de la valeur « rc » et/ou « wrc » ???

    Merci.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 160
    Points
    160
    Par défaut
    Je te proposerai bien une solution "crade", mais attends quand même de voir si on peut mieux faire ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FILE *fd = popen("monshell >/dev/null 2>&1 && echo $?");
    char buf[8];
    if (fd != NULL)
    {
        fgets(buf,8,fd);
        pclose (fd);
    }
    printf ("retour : %s\n",buf);

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 160
    Points
    160
    Par défaut
    En survolant rapidement le man de pclose, je suis tombé sur ça :
    Upon successful return, pclose() shall return the termination status of the command language interpreter. Otherwise, pclose() shall return -1 and set errno to indicate the error.
    Tu peux donc essayer de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FILE *fd = popen ("monshell","r");
    int ret = -100;
    if (fd != NULL)
    {
        ret = pclose (fd);
    }
    printf ("retour : %d\n",ret);

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    En fait, j'ai l'impression d'avoir ceci :.....
    Il semblerait que
    1- l'argument de exit soit en fait un "unsigned char" convertit en int par system() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    -128 -> 128 (0080) ?
    ...
     -2 -> 254 (00FE)
     -1 -> 255 (00FF)
      0 -> 0 (0000)
      1 -> 1 (0001)
    ...
    127 -> 127 (007F) ?
    soit si ex < 0 -> 256+ex
    et si ex >=0 -> ex
    qui sont les valeurs retournées par WEXITSTATUS (wrc)

    2- il y ait désaccord sur le boutisme entre la représentation binaire de l'argument de exit (retournée par system) et les int du code C.
    La valeur reçue serait interprétée comme (si tes int sont sur 16 bits (sizeof(int) == 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     -128 -> 128 (0080) -> (8000) ?
    ...
       -2 -> 254 (00FE)->(FE00)
       -1 -> 255 (00FF)->(FF00)
        0 -> 0 (0000)->(0000)
        1 -> 1 (0001)->(0100)
    ...
      127 -> 127 (007F) -> (7F00) ?
    soit si ex <0 -> 256*(256+ex) -> 65536+256*ex
    et si ex>0 -> 256*ex
    qui sont les valeurs de rc.

    Si c'est le cas, on devrait pouvoir rétablir la valeur :
    si wrc >= 128 ex = wrc-256
    sinon ex = wrc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Recuperer valeur de retour d'un script vbs ou js
    Par hannibal.76 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 20/12/2012, 16h54
  2. Réponses: 12
    Dernier message: 22/06/2010, 11h09
  3. Evenements récupérer dans un programme C#
    Par mike1987 dans le forum Débuter
    Réponses: 0
    Dernier message: 17/04/2009, 11h06
  4. Réponses: 3
    Dernier message: 17/09/2008, 14h02
  5. expect + tester valeur de retour d'un script
    Par dr_octopus74 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 30/04/2007, 16h12

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