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

POSIX C Discussion :

Problème avec la commande EXEC()


Sujet :

POSIX C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Problème avec la commande EXEC()
    Bonjour,

    Voici mon problème:

    Je dois développer sous un environnement linux, un programme PERE qui appelle un autre programme FILS. Ce que doit faire FILS est de retourner un nombre aléatoire situé entre 1 et 100. PERE de son côté lui doit recueillir ce nombre aléatoire et faire des traitements quelconque dessus.

    Ainsi je me trouve avec un fils.c qui lui retourne très bien le nombre aléatoire en question et un fichier pere.c qui lui essai d'aller chercher l'info de fils.c une fois compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -o fils.exe fils.c
    gcc -o pere.exe pere.c
    ainsi dans le code de pere.c dans le main j'ai écris une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = execl( "./", "fils.exe", NULL );
    mais lorsque je l'exécute il retourne toujours la valeur -1 comme quoi l'exécution du programme fils.exe a échoué. J'ai testé la commande exec() avec le fichier seulement mais je n'arrive toujours pas à comprendre comment aller chercher la valeur du nombre aléatoire que fils.exe retourne.

    Merci de l'entraide!

  2. #2
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Sans code source on risque pas de pouvoir beaucoup t'aider...

  3. #3
    Membre habitué
    Homme Profil pro
    BI Expert
    Inscrit en
    Décembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : BI Expert

    Informations forums :
    Inscription : Décembre 2005
    Messages : 181
    Points : 139
    Points
    139
    Par défaut
    verifie l'appel du processus fils!

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Code source
    Voici le code du FILS.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
        srand( time( 0 ) );
        sleep(1);
        return ( rand() % 100 + 1 );
    }
    voici le code du PERE.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     int x = 0;
            int fils = fork();
            printf( "je cree un fils.\n" );
            if( fils == 0 ) {
                x = execlp( "fils.exe", NULL );
                printf( "resultat = %d", x );
                if( x == 7 ) {
                    // je déclare le fils gagnant et j'affiche son PID
                }else{
                    // je kill le processus et il n'y a pas de gagnant
                }
            }
    Donc si le resultat == 7 soit le nombre aléatoire retourné par fils.c alors à ce moment je peux continuer mon travail, mais dans tout mes essais, il me retourne toujours -1.

    Merci!

  5. #5
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Extrait de man execlp :
    Citation Envoyé par man execlp
    Les fonctions execlp() et execvp() dupliqueront les actions de l’interpréteur de commandes dans la recherche du fichier exécutable si le nom fourni ne contient pas
    de barre oblique « / ». Le chemin de recherche est spécifié dans la variable d’environnement PATH. Si cette variable n’est pas définie, le chemin par défaut sera
    « /bin:/usr/bin: ». De plus, certaines erreurs sont traitées de manière spécifique.
    Donc, si tu ne spécifies pas le chemin complet vers ton programme, il va aller le chercher dans PATH ou dans /bin ou /usr/bin.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Reply
    Si je comprends bien c'est que je ne spécifie pas correctement ou rechercher l'exécutable de mon autre programme (soit fils.exe).

    J'ai testé plusieurs variante toutes aussi inffructueuses les unes que les autres exemples:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = execlp( "./fils.exe", NULL );
    x = execlp( "/fils.exe", NULL );
    x = execlp( "fils.exe", NULL );
    donc selon moi si je spécifie ./ c'est bien pour désigner le répertoire courant dans lequel je me trouve?

    Merci!

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kleoptras
    donc selon moi si je spécifie ./ c'est bien pour désigner le répertoire courant dans lequel je me trouve?
    non ça ça marche dans le shell car il a déjà un environnement (le répertoire où tu es).

    Quand tu fais un exec (ou un system) une partie de l'environnement est copié, mais pas les "cd" effectués depuis le début de la session. Tu auras bien les "PATH" etc.. mais sans plus.

    Ce qu'il faut c'est donner le chemin complet : /home/toi/ton_rep/bin/ton_exe

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Reponse
    Bon super finalement,

    J'ai réussi à le faire marcher ou presque, mais j'ai seulment besoin de le faire du shell donc finalment après que j'aie ré-écrit mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int fils = 0;
            int statut = 0;
            int resultat = 0;
            printf( "je cree un fils.\n" );
            fils = fork();
            if( fils == 0 ) {
                printf( "Mon fils tu es cree.\n" );
                resultat = execlp( "fils.exe", NULL );
            }else{
                wait( &statut );
                printf( "reslutat = %d\n", resultat );
            }
    Il appelle belle et bien fils.exe mais le retour du nombre aléatoire ne se fait toujours pas je recoit toujours 0 dans la valeur de l'appelle de fils.exe.

    Merci!

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kleoptras
    Bon super finalement,

    J'ai réussi à le faire marcher ou presque, mais j'ai seulment besoin de le faire du shell donc finalment après que j'aie ré-écrit mon code

    int fils = 0;
    int statut = 0;
    int resultat = 0;
    printf( "je cree un fils.\n" );
    fils = fork();
    if( fils == 0 ) {
    printf( "Mon fils tu es cree.\n" );
    resultat = execlp( "fils.exe", NULL );
    }else{
    wait( &statut );
    printf( "reslutat = %d\n", resultat );
    }

    Il appelle belle et bien fils.exe mais le retour du nombre aléatoire ne se fait toujours pas je recoit toujours 0 dans la valeur de l'appelle de fils.exe.

    Merci!

    NORMAL....

    Les fonctions exec, comme la fonction system, ne retourne que succès ou erreur (voir http://developer.apple.com/documenta.../execlp.3.html )

    RETURN VALUES
    If any of the exec() functions returns, an error will have occurred. The
    return value is -1, and the global variable errno will be set to indicate
    the error.
    Si tu veux renvoyer une valeur, il faut le faire soit dans un fichier, soit choisir une autre méthode... (ou si tu sous unixoide tu peux aussi faire un "export").

  10. #10
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Si tu veux récupérer la valeur de retour d'un autre programme vois du côté de popen()
    Cela dit je me demande si, pour ce que tu cherches à faire, un simple fork() + pipe ne serait pas suffisant... pas besoin de passer par un exécutable externe.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Merci!
    C'est exactement cela que j'étais entrain délaboré et d'apprendre comment élaboré et écrire un pipe en C.

    Merci à tous!

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

Discussions similaires

  1. Problème avec la commande exec("convert
    Par amalec78 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 02/02/2011, 14h06
  2. Problème avec la commande exec et netstat
    Par Didier100 dans le forum Langage
    Réponses: 7
    Dernier message: 06/01/2011, 15h29
  3. [Système] Problème avec la fonction exec()
    Par ben_harper dans le forum Langage
    Réponses: 13
    Dernier message: 28/06/2006, 11h32
  4. Problème avec la commande revoke sous oracle
    Par merlubreizh dans le forum Oracle
    Réponses: 19
    Dernier message: 28/04/2006, 15h02
  5. [C++] Problème avec la commande "make"
    Par quantik-revolution dans le forum Systèmes de compilation
    Réponses: 6
    Dernier message: 02/04/2006, 18h17

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