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 :

problemes avec la famille exec


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut problemes avec la famille exec
    j'ai des problemes avec la famille des fonctions execve,execlp ... que je n'arrive pas a utuliser sur mon pc. par exemple avec la fonction execve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <unistd.h>
    #include <stdio.h>
     
    int main()
    {
    	char cmd[32];
    	printf("cmd?:");
    	scanf("%s",cmd);
     
    	execve(cmd,NULL,NULL);
     
    	return 0;
    }
    ce programme n'execute pas la commande en fait il ne fait rien.
    et celui la avec execlp me donne une erreur de segmentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <unistd.h>
    #include <stdio.h>
     
    int main()
    {
    	char cmd[32];
    	printf("cmd?:");
    	scanf("%s",cmd);
     
    	execlp(cmd,NULL,NULL);
     
    	return 0;
    }
    et gdb affiche le message suivant:
    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff74c187a in strrchr () from /lib/libc.so.6
    (gdb) bt
    #0 0x00007ffff74c187a in strrchr () from /lib/libc.so.6
    #1 0x000000000040a36e in ?? ()
    #2 0x0000000000407bfe in ?? ()
    #3 0x00007ffff7460abd in __libc_start_main () from /lib/libc.so.6
    #4 0x0000000000402709 in ?? ()
    #5 0x00007fffffffe478 in ?? ()
    #6 0x000000000000001c in ?? ()
    #7 0x0000000000000000 in ?? ()
    (gdb)

    Je sollicite de toute urgence une aide car je deprime rien qu'au essaye toutes les combinaisons mais sans succes. Merci d'avance.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 18
    Points : 19
    Points
    19
    Par défaut
    Salut!

    Si tu veux exécuter une commande externe, pour quoi pas utiliser la fonction du C, system?

    Essayez de changer la ligne:

    execlp(cmd,NULL,NULL);

    par

    system(cmd);

  3. #3
    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 Alex le grand Voir le message
    Je sollicite de toute urgence une aide car je deprime rien qu'au essaye toutes les combinaisons mais sans succes. Merci d'avance.
    Ah ! Si tu y vas à tatons, c'est normal que cela ne donne pas beaucoup de résultats.

    32 caractères, c'est un peu court. Si tu dois passer un chemin un peu long, tu risques de déborder, et tu as des chances d'obtenir une segfault. Essaie d'en mettre 320, par exemple, pour commencer.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    	execve(cmd,NULL,NULL);
    Extrait de la man page :
    On Linux, argv and envp can be specified as NULL, which has the same effect as specifying these arguments as pointers to lists containing a single NULL pointer. Do not take advantage of this misfeature! It is non-standard and non-portable: on most other Unix systems doing this will result in an error.

    Mettre argv et envp à NULL est donc une mauvaise idée. Ensuite :

    Le premier argument de ton programme (le premier NULL, ici, donc) est censé représenter le nom du programme appelé, par convention. Il est probable que ce soit le programme appelé qui plante, et non celui que tu as écrit. Essaie plutôt execlp (cmd,cmd,NULL);

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 25
    Points : 13
    Points
    13
    Par défaut
    marche bien et je ne sais pas pourquoi car le code :
    marchait egalement sur les machines de mon ecole.
    Peut etre du c'est a la distribution linux?

  5. #5
    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
    Citation Envoyé par Alex le grand Voir le message
    marche bien et je ne sais pas pourquoi car le code :
    marchait egalement sur les machines de mon ecole.
    Peut etre du c'est a la distribution linux?
    C'est écrit dans l'extrait que je te donne dans mon précédent commentaire. En français, cela donne :

    « Sous Linux, argv et envp peuvent être spécifiés comme NULL, ce qui a le même effet que spécifier ces arguments en tant que pointeurs vers des listes contenant uniquement un pointeur NULL. Ne profitez pas de cette non-fonctionnalité : ce n'est ni standard, ni portable. Sur la plupart des autres systèmes Unix, faire cela conduit à une erreur »

    Autrement dit, Linux a solidifié cette faiblesse et c'est normal, mais cela ne veut pas dire qu'il est légal de l'écrire. Selon les systèmes, cela provoquera un comportement indéterminé.

    Ensuite, je n'ai pas lancé ton programme, comme tu fais un exec(), on ne sait pas à quel moment ça plante : soit c'est ton programme père (peu probable), soit c'est la CRT au démarrage du fils, soit c'est le code du fils lui-même qui essaie de lire son propre nom et qui tombe sur un pointeur NULL complètement inattendu (ce qui reste sale : la validité d'un pointeur doit toujours être vérifiée).

Discussions similaires

  1. Problemes avec le php exec
    Par inkydjango dans le forum Langage
    Réponses: 2
    Dernier message: 17/09/2010, 16h03
  2. probleme avec la task exec
    Par juliend09 dans le forum ANT
    Réponses: 1
    Dernier message: 27/08/2008, 16h16
  3. probleme avec runtime exec
    Par john123 dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 17/07/2007, 11h57
  4. [Système] Probleme de PATH avec la fonction exec
    Par Sylvain71 dans le forum Langage
    Réponses: 11
    Dernier message: 16/07/2006, 17h04
  5. [VBscript] probleme avec shell.exec
    Par eown dans le forum Windows
    Réponses: 1
    Dernier message: 23/04/2006, 09h24

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