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

C Discussion :

Appel d'un programme extérieur et récupération de la sortie


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut Appel d'un programme extérieur et récupération de la sortie
    Bonjour

    J'ai trouvé comment lancer un programme externe en C et récupérer la main après : la fonction système.
    Le programme que je lance renvoie une sortie sous forme de int. J'aimerai récupérer cette sortie. Je fais comment ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Le code retourne par le programme est retourne par system.

    Si c'est sous forme d'IO sur la sortie standard, popen().
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Le problème c'est que je ne récupère pas le code prévu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        num=system("./combien_SDL Lequel\\ enlever\\ \\? 1");
        printf("%d %hu %hd %lu %ld\n",num,num,num,num,num);
    À la fin du programme appelé je récupère autre chose...
    0 0 0 0 0

    À la fin de combien_SDL, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("%d",retour);
    	return retour;
    J'ai bien le bon nombre qui s'affiche. C'est à dire autre chose que le 0 que je récupère !

    Petite modif dans le retour ?? pourquoi ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       printf("%d\n",num>>8);
        printf("%hd\n",num>>8);
        printf("%ld\n",num>>8);
        printf("%u\n",num>>8);
        printf("%hu\n",num>>8);
        printf("%lu\n",num>>8);
    affiche ce que je souhaite...

    Je suis à la rue !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Si c'est sous forme d'IO sur la sortie standard, popen().
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je ne voudrais pas d'IO sur la sortie standard !
    Si c'est bien que que je crois, l'IO ce serait récupérer ce qu'a mis le printf.
    Ce printf n'est là que pour le débogage. Je souhaite récupérer la sortie du return.

    Et la sortie du return, ce n'est tout de même pas de I/O ? Si ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdlib.h>
    #include <stdio.h>
    #include <sys/wait.h>
     
    int main()
    {
        int res = system("exit 0");
        int res2 = system("exit 42");
        printf("%d, %d\n", WEXITSTATUS(res), WEXITSTATUS(res2));
        return 0;
    }
    man waitpid pour WEXITSTATUS, il faudrait aussi utiliser WIFEXITED pour faire un controle d'erreur plus fin des erreurs.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Merci !

    Pour ce que je compte faire, c'est bon ! Mais un test me montre que je récupère le reste de mon retour par 256 ! Mon retour ne dépasse pas ce nombre
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  8. #8
    Membre éclairé Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Points : 723
    Points
    723
    Par défaut
    Une erreur fréquente est de faire des retours négatifs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(void)
    {
        return (-1); /* La valeur de retour sera de 255 */
    }
    “La seule révolution possible, c'est d'essayer de s'améliorer soi-même, en espérant que les autres fassent la même démarche. Le monde ira mieux alors.”

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Sauf si on fait un transtypage !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (signed char)WEXITSTATUS(res)
    Non ?
    Donc, c'est bien ce que je pensais, on récupère un char à la fin !

    C'est sûrement pour ça que popen m'a été conseillé
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour,

    Citation Envoyé par troumad Voir le message
    Pour ce que je compte faire, c'est bon ! Mais un test me montre que je récupère le reste de mon retour par 256 ! Mon retour ne dépasse pas ce nombre
    C'est normal : le code de retour doit généralement tenir sur huit bits, et WEXITSTATUS ne t'en retournera pas plus. Extrait de la man page

    Citation Envoyé par man waitpid
    WEXITSTATUS(status)
    returns the exit status of the child. This consists of the least significant 8 bits of the status argument that the child specified in a call to exit(3) or _exit(2) or as
    the argument for a return statement in main(). This macro should only be employed if WIFEXITED returned true.

    Un nombre tronqué sur huit bits est donc forcément son modulo 256 (de la même façon que les deux derniers chiffres d'un nombre décimal, par exemple, sont forcément son modulo 100).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/11/2012, 12h06
  2. Appel d'un programme extérieur sous Solaris
    Par Thordax dans le forum C++
    Réponses: 2
    Dernier message: 11/07/2006, 17h25
  3. Réponses: 4
    Dernier message: 01/05/2006, 14h37
  4. appelle de plusieurs programme
    Par vince2005 dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2006, 21h35
  5. DLL Visual C++ appelée dans un programme Visual Basic
    Par marseillais57 dans le forum MFC
    Réponses: 7
    Dernier message: 21/07/2005, 14h57

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