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 commande system()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut Utilisation commande system()
    Bonjour,

    J'ai un binaire en C sous Linux qui utilise la fonction system() dans une boucle for.

    Seulement au bout d'un nombre d'itération assez aléatoire (vers 240) je me retrouve avec des processus zombie de ma commande et ma machine plante.
    Et accessoirement j'ai un message fork: Resource temporarily unavailable
    La commande system fait appel à un fork puis à un exec (grosso modo) ?

    J'en déduis que je n'ai plus de ressource pour creer un autre processus donc ça plante.

    Mais la commande system ne doit-elle pas attendre la fin de l'execution de la commande avant de rendre la main (fin du processus fils et retour dans le processus père) ?

    Merci par avance pour toute piste d'éclaircissement.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Par défaut
    Bonjour,

    Oui, je crois que l'appel de fonction system("commande"); effectue un fork, et un exec pour charger le programme /bin/sh. Et c'est ensuite le shell qui exécutera la "commande" spécifiée en argument. ça revient en gros à faire un /bin/sh "commande".

    Si la chaine que tu passe en argument à la fonction system contient un '&' (généralement à la fin), alors l'exécution se fait en parallèle. le shell créera le processus "commande" et rendra la main à ton programme (sans attendre la fin de "commande"). Sinon, "commande" s'exécutera entièrement de bout en bout avant de rendre la main à ton programme.

    Je te suggère de vérifier déjà qu'il n'y ait pas de & dans ta commande et aussi de comprendre pourquoi les processus qui se lancent ne se terminent pas (il est possible que l'exécution de "commande" crée d'autres processus en parallèle, et s'achève sans que ses fils ne s'achèvent - jamais ???)

  3. #3
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    quel est le contenu de votre commande system() ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par bardiya Voir le message
    Mais la commande system ne doit-elle pas attendre la fin de l'execution de la commande avant de rendre la main (fin du processus fils et retour dans le processus père) ?
    ça dépend de comment elle a été codée...


    Si la commande est :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    s = system ( "toto.exe" ) ;

    alors elle attend la fin de toto.exe


    Si par contre c'est :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    s = system ( "toto.exe &" ) ;

    sous unixoide par exemple non ça n'attend pas la fin de toto.exe, cela retourne dès que le lancement de toto;exe est fait...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut
    Bonjour,

    merci pour vos réponses,

    Je n'ai pas mis de "&" dans ma commande, c'est une commande très obscure qu'on m'a filé qui lance une appli avec une floppée d'arguments.

    Donc je ne sais pas trop ce qu'il se passe derrière, si cette nouvelle appli lance elle-même des processus alors là je suppose que c'est l'accident bête ?

    On m'a donné une solution plus "propre" que je vais tester pour être sûr d'attendre le retour.

    Mais dorénavant je pense que j'éviterai cette fonction system().

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par bardiya Voir le message
    Mais dorénavant je pense que j'éviterai cette fonction system().
    Lancer des processus avec system() effectivement la réputation d'être sale… si l'on ne sait pas ce que l'on fait ! Éviter la commande sans savoir pourquoi non plus n'est guère mieux.

    On peut voir la commande en question avec la flopée d'arguments ? Fais-nous un copier-coller de la commande concernée.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut
    Je suis tout à fait d'accord avec toi sur le principe, je manque de temps pour approfondir l'origine du problème.

    system("txx - tesXX "MAJ Messagerie Utilisateur %s MDP %s EspaceMessagerie %s");

    Voici ce que j'envoie, l'appli tesXX permet entre autre la mise à jour d'une messagerie et nécessite les 3 arguments qui la suive (les %s c'est pour remplacer une chaine quelconque).

    Lorsque je lance cette commande, j'ai un retour OK ou KO.
    Si je lance cette même commande dans la boucle de mon binaire, j'ai des retours sur les 200 premières itérations puis des process zombies.

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

Discussions similaires

  1. Utiliser des commandes systemes de linux ?
    Par tead_002 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 18/02/2010, 16h22
  2. Réponses: 6
    Dernier message: 24/09/2009, 17h44
  3. Problème avec l'utilisation de la commande system awk
    Par vbcasimir dans le forum Linux
    Réponses: 3
    Dernier message: 05/10/2004, 16h18
  4. [Stratégie] Utiliser un systeme de bufferisation
    Par arnolanf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/10/2002, 16h49

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