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 :

famille exec et changement variable


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut famille exec et changement variable
    Bonjour

    je suis bien embêté pour modifier le premier argument
    que ce soit : execve,execvp,execv et execl,execlp,execle
    chacun a en premier argument const char

    alors j'ai bien lu le man et un autre site qui propose des exemples simples

    http://pubs.opengroup.org/onlinepubs...ions/exec.html

    http://www.linux-france.org/article/...3/execv-3.html

    j'ai tenté avec toutes les formes primitives exec
    ici je fais avec execl mais le problème je pense viens du retour de la fonction qui pourtant change bien les variables

    dans une function :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void function(char pgm[40], char *argu[])
    char chem[8]="/bin/";
    strcat(chem, pgm); // On concatène chem dans pgm2
    argu[0] = chem;
    ...
    // je change aussi
    argu[1] = pgm;
    argu[2] = parametre;
    //tout se passe bien
    }


    dans le programme principale:

    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
    20
    char *_path=NULL;
    //const char *_path=NULL;// j'ai bien essayé aussi avec const mais c'est pas ça le problème
     
    char *argv[3];
     
    fprintf(stdout,"Nom du pg a lancer (exit pour sortir)\n: ");
    fscanf(stdin, "%[^\n]", pgm);
    // pour l'instant je lance juste ls pour tester donc dans function je chem n'a que taille 8 j'ai aussi pensé au problème du /0 final
     
    function(pgm, argv);
    fprintf(stdout, "on continue 1 avec : %s %s %s %s\n", argv[0],argv[1],argv[2],_path);// cela affiche bien : bin/ls ls (null) (null)
     
    //argv[0]="/bin/ls";
    _path=argv[0]; // après retour de la fonction
    //_path="/bin/ls";
     
    fprintf(stdout, "on continue 1 avec : %s %s %s %s\n", argv[0],argv[1],argv[2],_path);///cela affiche bien : bin/ls ls (null) /bin/ls
    //pourtant :
    execl(_path, argv[1],argv[2],NULL);// pas OK après la fonction pour la variable path
    execl(_path, argv[1],argv[2],NULL);// Ok si _path="/bin/ls"; ou si argv[0]="/bin/ls"; _path=argv[0];

    donc je ne comprend donc pas ce qui ne vas pas ?

    merci à vous de m'aider à trouver une explication et une solution

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu références via les éléments d'argv au moins une zone mémoire, chem, dont tu n'as plus l'ownership - et qui pour ne rien arranger est sur la pile - car locale à la bien nommée (sarcasme !) function et donc libérée dès que cette dernière retourne.

    Accessoirement la taille du buffer de destination de ton appel à strcat (premier argument) est insuffisante. Ça passe avec "ls", ça va péter avec "cat" ou "awk".

  3. #3
    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 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par nouilletonne Voir le message
    Bonjour

    je suis bien embêté pour modifier le premier argument
    que ce soit : execve,execvp,execv et execl,execlp,execle
    chacun a en premier argument const char
    Pas tout à fait. Chacune a en premier argument "const char étoile". Donc déjà si tu confonds "pointeur" et "caractère" alors vaut mieux revenir en arrière et réapprendre les pointeurs.

    Ce qui ne pose en fait aucun problème. Le fait que la fonction reçoive un pointeur et qu'elle le stocke dans un "const char étoile" signifie simplement qu'elle s'engage à ne pas tenter de modifier le pointeur en question. Toi, ça te laisse totalement libre de lui passer tout pointeur de ton choix (et compatible). Donc tu peux lui passer un char étoile, un const char étoile, un char [], bref ce que tu sens. Et si tu as créé ton char [] de toute pièce avec ce qui t'intéresse ça ne posera aucun souci.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <unistd.h>
     
    int main(int argc, char *argv[])
    {
    	execl(argv[1], argv[1], argv[2], NULL);
    }

    Tu nommes ce programme "toto.c", le compile en "toto", tu pourras alors l'invoquer en lui passant 2 arguments: le nom de l'exécutable et un argument ; par exemple "./toto /bin/cat /etc/passwd" => ça te fera un "cat /etc/passwd"

    Alors pourquoi je dédouble dans l'appel argv[1] (qui est sensé contenir le nom du programme à lancer) ? Parce que ce programme possède lui-aussi un argv et que pour lui, argv[0] doit-être son propre nom (très exactement la chaine qui a servi à l'appeler => si tu appelles par exemple "/tmp/../etc/../bin/ls" alors dans le programme "ls", son argv[0] contient exactement cette chaine).
    Donc le premier argv[1] c'est pour que execl sache quoi invoquer et le second argv[1] c'est pour qu'il soit passé audit programme en tant que premier argument argv[0].
    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]

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

Discussions similaires

  1. stocké le résultat de Exec dans une variable !
    Par zoro007 dans le forum Linux
    Réponses: 3
    Dernier message: 06/01/2011, 13h08
  2. problemes avec la famille exec
    Par Alex le grand dans le forum C
    Réponses: 4
    Dernier message: 25/03/2010, 17h04
  3. Réponses: 0
    Dernier message: 03/09/2009, 11h23
  4. [T-SQL] Récupération d'un exec dans une variable
    Par Thecr0w dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/03/2008, 17h28
  5. Réponses: 3
    Dernier message: 15/06/2006, 16h43

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