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

Linux Discussion :

Execlp ferme mon programme


Sujet :

Linux

  1. #1
    Expert confirmé
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Par défaut Execlp ferme mon programme
    bonjour,
    j'essaie de développer un programme dans lequel je dois éxécuter des commandes dans le shell (décompression de fichiers). la fonction system ne me plait pas parce que je dois faire des malloc, strcpy dans tous les sens pour avoir la commande finale. j'ai trouvé execlp qui me va très bien : j'ai juste à donner les arguments et voilà

    le souci est que cette fonction ferme mon programme et c'est pas vraiment l'effet recherché

    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
    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
    57
    int create_package(GtkWidget *pWidget, gpointer data)
        {
        const gchar *parm_tarbz2; //where is the tar.bz2 to convert ?
        const gchar *parm_xml; //where is the xml to include in the package ?
        const gchar *parm_configure; //is there any parameter to pass to ./configure ?
        gchar *outdir;
        int i;
        gchar *command;
        GtkWidget *pDialog;
            
        outdir = (gchar*)malloc(sizeof(gchar) * strlen("/home/mik/Projects/fps_out/"));
        debug("create_package : malloc ok");
        strcpy(outdir,"/home/mik/Projects/fps_out/");
        /* get all parameters */
        parm_tarbz2 = gtk_entry_get_text(GTK_ENTRY(MainNew.entry1));
        parm_xml = gtk_entry_get_text(GTK_ENTRY(MainNew.entry2));
        parm_configure = gtk_entry_get_text(GTK_ENTRY(MainNew.entry3));
            
        i = chdir(outdir);
        switch(i)
        {
            case -1:
                if(mkdir(outdir,0755)==-1)
                {
                pDialog = gtk_message_dialog_new(GTK_WINDOW(MainNew.wizard),
                    GTK_DIALOG_MODAL,
                    GTK_MESSAGE_INFO,
                    GTK_BUTTONS_OK,
                    "Impossible de créer le répertoire %s : veuillez vérifier vos droits", outdir);
                gtk_dialog_run(GTK_DIALOG(pDialog));
                gtk_widget_destroy(pDialog);
                return 0;
                }
                break;
            case EACCES:
                pDialog = gtk_message_dialog_new(GTK_WINDOW(MainNew.wizard),
                    GTK_DIALOG_MODAL,
                    GTK_MESSAGE_INFO,
                    GTK_BUTTONS_OK,
                    "Impossible d'accéder au répertoire %s : veuillez vérifier vos droits", outdir);
                gtk_dialog_run(GTK_DIALOG(pDialog));
                gtk_widget_destroy(pDialog);
                return 0;
                break;
            case 0:
                debug("create_package : chdir ok");
                break;            
        }
         //command = (gchar*)malloc(sizeof(gchar) * (strlen("tar xfj ")+strlen(parm_tarbz2)));    
         //strcpy(command, "tar xfj ");
         //strcat(command, parm_tarbz2);
         //system(command);
         //g_print(command);
        i = execlp("tar", "tar","xfj", parm_tarbz2, NULL);
          
        return 1;
        }
    lorsque je mets le code original (celui en vert), ça ne se ferme pas. mais quand je mets la ligne avec execlp, ça fait bien ce que je veux mais ça ferme mon programme juste après avoir fini.
    je ne vois vraiment pas d'où ça peut venir... vous pouvez m'aider ?


  2. #2
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Ben c'est normal... Un exec* remplace le code "utilisateur" par celui qui est appelé (ici, par exemple, tar).
    Donc comme le code a été remplacé, une fois que l'appel termine, il termine aussi ton code.

    La solution est de faire un fork+exec* : ainsi, c'est le code du processus fils qui sera écrasé lors de l'appel à exec* : le processus parent, lui, continuera à s'éxécuter correctement. Attention à tout de même prendre en compte dans quel état meurt le processus fils (ok, erreur, autre ?)

    Pour info, lorsque tu appelles system(), ce sont des opérations semblables (mais qui te sont cachées), qui sont effectuées.

    Voilou.


    Edit :
    Pour plus de détails, je te renvoie à la page adéquate du manuel
    man execve (puisque la fonction que tu utilises appelle execve)
    En cas de réussite, execve() ne revient pas à l'appelant, et les segments de texte, de
    données, ainsi que la pile du processus appelant sont remplacés par ceux du programme
    chargé.
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Expert confirmé
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Par défaut
    elle me plaisait bien cette fonction pourtant
    je vais continuer avec system alors...
    merci à toi

  4. #4
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Citation Envoyé par Michaël
    elle me plaisait bien cette fonction pourtant
    je vais continuer avec system alors...
    Ben euh, je vois pas où est le problème... Tu as juste à faire un fork pour appeler ton exec.

    Grosso merdo (je n'ai plus la syntaxe en tête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <....>
    if (fork() == 0){ /* fils */
        execlp(.............);
    }
    else{ /* père */
        wait(NULL); /*  pas nécessaire, seulement si tu souhaites attendre le retour de ton appel */
    }
    (modulo les traitements d'erreurs)
    merci à toi
    Pas de quoi
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Expert confirmé
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Par défaut
    j'ai dû lire trop vite ton premier message

    à part ça, ça marche avec fork

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 18/10/2011, 00h52
  2. Réponses: 1
    Dernier message: 31/07/2010, 18h33
  3. [FASM] Mon programme ne se ferme pas
    Par _SamSoft_ dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 10/09/2007, 18h57
  4. Réponses: 2
    Dernier message: 07/06/2007, 08h34
  5. [Dev-Pascal] Mon programme se ferme trop vite après la dernière instruction
    Par am002r dans le forum Autres IDE
    Réponses: 4
    Dernier message: 08/05/2007, 10h25

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