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 :

difference system() et execl()


Sujet :

C

  1. #1
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut difference system() et execl()
    alors j'utilise la fonction suivante pour declancher une commande du system :
    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
     
    void launche(void)
    {
        if(flag == 0)
        {
            return;
        }
        if(fork()==0)
        {
            execl("/bin/ls", "ls", NULL);
        }
        else
        {
           flag = 0;
        }
    }
    mais si je remplace execl() par system() le programe présente une segmentation faulte ????

    et je sais que system() ne remplace pas le context du process courant et execl() remplace le context du process courant par celui appellé.

    Est ce que il y a d'autre différence?
    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    system() inclut déjà l'appel à fork(), et par conséquent retourne une fois l'appel effectué (contrairement à exec() qui ne retourne qu'en cas d'erreur).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Et system() utilise le shell du système pour exécuter la ligne de commande, tandis que exec() lance un programme avec ses arguments...

    a++

  4. #4
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Merci

    mais le problème de segmentation fault vient d'ou exactement ?

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par cmoibal
    et je sais que system() ne remplace pas le context du process courant et execl() remplace le context du process courant par celui appellé.

    Est ce que il y a d'autre différence?
    Bah, system est standard, execl ne l'est pas. system passe une chaîne à l'interpréteur de commandes et demande à e dernier d'exécuter la chaîne ainsi passée, execl exécute un programme (en remplaçant l'image du processus appelant par celui du nouveau processus). Quite à utiliser execl, je recommande plutôt spawnl. Cette fonction s'utilise de la même façon qu'execl mais offre plus d'options. Elle permet entre autres d'exécuter un pogramme puis de reprendre l'exécution de l'appelant à la fin de l'appelé. Et on peut bien sûr faire un execl avec un spawnl.

  6. #6
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    mais sawnl() n'existe pas dans mon sytème, je travail sur LINUX(ubuntu).

    En plus, execl() appartient au norme POSIX, donc c'est une standard de C. De même pour system() ....

    Alors, aprart que execl() ne peut pas retourné des valeur, est ce que il y a d'autre difference dans la consomation de la memoire.... parceque personnelment je pense que c'est un problème lié a la memoire de PC.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Si tu as un segmentation fault cela vient surement de ton code et non pas de system() ou de execl()...

    a++

  8. #8
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    mais, le problème n'est présent qu'avec la fonction sytem(); ????

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    On pourrait voir le code et des éventuelles traces de debug ?

    a++

  10. #10
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    POSIX est une norme de système d'exploitation pas un "standard du langage C".
    Citation Envoyé par cmoibal
    mais, le problème n'est présent qu'avec la fonction sytem
    montre comment tu utilise system.

  11. #11
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    voila le code avec system():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void launche(void)
    {
        if(flag == 0)
        {        return;
        }
        flag = system("/bin/ls");
    }

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    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 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    voila le code avec system():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void launche(void)
    {
        if(flag == 0)
        {        return;
        }
        flag = system("/bin/ls");
    }
    A priori, il n'y a aucun soucis avec ton system(). Il se peut que tu aies dans ton code un autre problème qui amène à ce comportement indéterminé...

    PS: Les globales c'est le mal...
    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]

Discussions similaires

  1. Question RSA : encryption et decryption avec des systemes differents
    Par Djobird dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 03/02/2011, 18h25
  2. la difference entre date systeme et date
    Par soumia_adr dans le forum DB2
    Réponses: 1
    Dernier message: 09/04/2009, 15h26
  3. Différence file system et raw partition
    Par frutix dans le forum Administration système
    Réponses: 1
    Dernier message: 03/02/2006, 14h18
  4. [Système][Appel system linux]Différence dossier /link
    Par busta28 dans le forum Général Java
    Réponses: 5
    Dernier message: 16/04/2005, 22h00
  5. 2 systeme linux identique sur 2 hd differents
    Par tomnie dans le forum Administration système
    Réponses: 17
    Dernier message: 30/03/2004, 11h17

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