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 :

Utilisation de execve


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut Utilisation de execve
    Bonjour, je cherche à utiliser execve pour un exercice. Cependant après de nombreuse recherche sur le net, je ne comprends toujours pas comment cela marche.
    Je l'utilise de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int     main(int argc, char **argv, char **envp)
    {
      info(argc, argv);
      my_pid();
      execve(argv[1], argv, envp);
    }
    Cependant rien ne s'affiche, étant donné que argv[0]*est le nom de mon executable, je lui donne argv[1]*afin qu'il lance le fichier passé en paramètre, mais rien ne se passe...
    Pourquoi?

    Merci pour l'aide que vous pourriez m'apporter.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    il faut que argv[1] soit une commande valide, et quelle fasse quelque chose.

    Essaie ton programme avec les arguments <program> dir c:.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir.
    int execve(const char *file, char *const argv[], char *const envp[]); fait partie de la famille des primitives de recouvrement (qui sont au nombre de six).
    Le but des primitives de recouvrement consiste à charger en mémoire à la place d'un processus fils un autre programme provenant d'un fichier exécutable (binaire). Ici execve peut exécuter soit des fichiers binaires soit des scripts.
    1. Le Premier argument est le non du fichier
    2. Le deuxième argument est un tableau de chaînes d'arguments que l'on doit fournir au nouveau programme et qui doit se terminer par un pointeur NULL.
    3. Le dernier argument est l'environnement du nouveau programme (sans trop rentrer en détail) tout comme le deuxième argument le troisième doit également se terminer par un pointeur NULL.

    Voici un code source à titre d'exemple ci-dessous
    (Attention le code source est susceptible de contenir des erreurs)
    Code C : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    /*
    *  Exemple Primitive de recouvrement 
    *  des primitives execve
    *  File: source.c
    *  Version: 0.0.1 Bêta GPLV3.
    *  Created by SAMBIA39 on 06/01/2015.
    *  Copyright (c) 2015 SAMBIA39 & Developpez.net
    */
     
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
     
    #define MAX_ARG 5   /*  Nombre max des arguments    */
     
    /*
     * Programme principal
     */
    int main( int argc, char **argv ){
     
        unsigned short i = 0;
        char *ptr_new_arg[MAX_ARG] = { NULL };
     
        if( (1) < argc ){
            //Copie des arguments
            ptr_new_arg[0] = argv[1];
            for( i = 1; argc != i; i++ )
                ptr_new_arg[i] = argv[i];
     
            /* 
             * Affichage d'informations 
             * complémentaires 
             */
            fprintf( stdout, "Lancement de %s ...\n", argv[1] );
            fprintf( stdout, "PID = %d && PPID = %d [%d]\n",
                getpid(), getppid(), getuid() );
     
            /*
             * Gestion d'erreur 
             * en cas d'échec de la primitive
             */ 
            errno = 0;
            if( (-1) ==  execve( argv[1], ptr_new_arg, NULL ) ){
                fprintf(stderr, "(%d)\t:%s\n\t:%s\n", errno,
                    "Aucun fichier exécutable/Error\n", strerror(errno) );
                _exit( EXIT_FAILURE );
            }
        }else{
            fprintf( stderr, "Attention/Échec -> argument  inssufisant\n");
            _exit( EXIT_FAILURE );
        }
        return EXIT_FAILURE;
    }


    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    ./a_out_dbg ./b_out_dbg
    Code OUT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Lancement de b_out_dbg ...
    PID = 4201 && PPID = 1629 [501]
    print b_out_dbg -> www.developpez.net

    Code OUT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Lancement de titi...
    PID = 4421 && PPID = 1629 [501]
    (2)	:Aucun fichier exécutable/Error
     
    	:No such file or directory

    Code OUT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Attention/Échec -> argument  inssufisant
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  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 691
    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 691
    Points : 30 988
    Points
    30 988
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SBRKH Voir le message
    Cependant rien ne s'affiche, étant donné que argv[0]*est le nom de mon executable, je lui donne argv[1]*afin qu'il lance le fichier passé en paramètre, mais rien ne se passe...
    Pourquoi?
    Bonjour

    Si ton programme se nomme (par exemple) toto, alors tape la commande suivant: ./toto ls -l...
    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
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par SBRKH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execve(argv[1], argv, envp);
    Cependant rien ne s'affiche, étant donné que argv[0]*est le nom de mon executable, je lui donne argv[1]*afin qu'il lance le fichier passé en paramètre, mais rien ne se passe...
    Pourquoi?
    le point important c'est argv ici, comme sambia39 l'a fait également dans son code en recopiant les arguments en partant de argv[1]on peut s'en sortir facilement en truandant un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <unistd.h>
    int main(int argc, char **argv, char **envp) {
            execve(argv[1], &argv[1], envp);
            return 0;
    }
    par contre il est important de spécifier le chemin *complet* de la commande qu'on veut lancer, execve n'ira pas la chercher tout seul sur son premier argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./pouet /bin/ls -ls
    total 16
    12 -rwxrwxr-x 1 gruik gruik 9675 janv.  6 07:24 pouet
     4 -rw-rw-r-- 1 gruik gruik  145 janv.  6 07:24 pouet.c

  6. #6
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2015
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Merci à vous tous ! Je ne compilais pas le programme que je voulais lancer avec execve en fait... et le chemin des arguments était mauvais aussi. Sujet résolu, merci beaucoup !

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

Discussions similaires

  1. Utilisation d'execve sur linux 2.6
    Par maofan dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/05/2013, 11h59
  2. utilisation de execve
    Par yamnetouaga dans le forum C
    Réponses: 9
    Dernier message: 16/02/2007, 12h09
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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