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

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2019
    Messages : 3
    Points : 4
    Points
    4

    Par défaut Comment exécuter un programme indépendant à partir d'un autre ?

    Bonjour à tous,

    Je souhaiterais réaliser un programme qui lit son exécutable (le fichier binaire à partir du quel il est exécuté), puis se recopie avant d'exécuter la copie. L'idée est que la copie doit être, lorsqu'elle est éxecutée, un programme à part entière indépendant du programme père, afin qu'elle même ait la capacité de se copier... J'insiste sur le fait que la copie doit avoir le même statut que le programme père.

    J'utilise le C++ mais peut-être que ce n'est pas le meilleur choix : un langage bas niveau serait peut-être plus approprié ?

    Cela fait plusieurs mois que je travaille dessus (sur feuille, puis tests sur ordinateur), mais je me heurte à un problème en particulier :
    Je n'ai pas trouvé de solutions efficaces pour exécuter la copie de manière à ce qu'elle soit un programme indépendant : par exemple la commande system("./copie") ne fonctionne évidemment pas puisqu'elle établit une sorte de dépendance entre le programme père et la copie. En gros : le programme père exécute la copie puis continue sa vie sans attendre quoi que ce soit de cette dernière et la copie vit sa vie sans attendre quoi que ce soit du programme père. C'est aujourd'hui le plus gros problème auquel je me heurte sans trouver de solutions. Je me suis penché du côté des processus mais je n'ai pas trouvé de moyen.
    Comment exécuter un programme indépendant à partie d'un autre ?

    En recherchant des solutions sur des forums je suis très souvent tombé sur des questions qui m'interssaient mais dont les seules réponses étaient : "Pourquoi poser une telle question ?", "Inutile de faire un tel programme !"...
    C'est pourquoi j'aimerais avoir une réponse à ma question même si cela peut paraître bête ou je ne sais quoi.
    En revache, si vous avez des suggestions (changer de langage, de stratégie...) je suis preneur.

    Je travaille sous Linux, en C++11.

    Merci par avance de me lire et peut-être proposer des solutions ou suggestions ?

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 256
    Points : 22 904
    Points
    22 904

    Par défaut

    fork
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : décembre 2015
    Messages : 893
    Points : 4 592
    Points
    4 592

    Par défaut

    Bonjour,

    Pour lancer un autre processus dont on connait le nom, il faut utiliser une des fonctions exec()., il faut auparavant cloner le processus par fork(), car le exec() va "transformer" le processus courant.
    Pour créer 2 processus issu d'un même exécutable, il faut utiliser fork() qui n'existe que sous les système POSIX.

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 256
    Points : 22 904
    Points
    22 904

    Par défaut

    puis se recopie avant d'exécuter la copie
    Le fork suffira, car il n’exécutera pas un autre exe.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2019
    Messages : 3
    Points : 4
    Points
    4

    Par défaut

    Merci pour les réponses,

    Je vais donc repartir sur cette piste, cependant...

    Citation Envoyé par chrtophe Voir le message
    Le fork suffira, car il n’exécutera pas un autre exe.
    Il est important que la copie soit éxecutée car elle est susceptible d'être modifiée lors de sa copie... Il me semble que fork() crée une autre instance d'un même programme si je comprends bien. Or les deux programmes (père et copie) sont bien différents (potentiellement).

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 256
    Points : 22 904
    Points
    22 904

    Par défaut

    fork crée une autre instance, mais chaque instance est autonome et a son propre PID.

    extrait du man :

    Sous Linux, fork() est implémenté en utilisant une méthode de copie à l'écriture. Ceci consiste à ne faire la véritable duplication d'une page mémoire que lorsqu'un processus en modifie une instance. Tant qu'aucun des deux processus n'écrit dans une page donnée, celle-ci n'est pas vraiment dupliquée. Ainsi les seules pénalisations induites par fork sont le temps et la mémoire nécessaires à la copie de la table des pages du parent ainsi que la création d'une structure de tâche pour le fils.
    Par contre, le fork hérite des fichiers ouverts
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 18
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2019
    Messages : 3
    Points : 4
    Points
    4

    Par défaut

    Bonjour,
    Je n'avais pas compris l'utilisation de fork - exec.
    Si maintenant j'ai bien compris, cette méthode devrait me convenir. Juste deux petites questions :

    -Dans le cours ''Programmation avancée sous Linux''
    §3-2-2-2 (https://mtodorovic.developpez.com/li...age_3#L3-2-2-2)
    Je ne comprends pas bien la phrase suivante :
    "Dans la mesure où exec remplace le programme appelant par un autre, on n'en sort jamais à moins que quelque chose ne se déroule mal."
    On ne sort jamais d'où ?

    -Après un fork, lorsque exec remplace le programme dans le processus enfant, est-ce que le progralme enfant est considéré comme terminé ? (wait() recevra-t-il quelque-chose ?)

    Merci beaucoup

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    10 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 10 256
    Points : 22 904
    Points
    22 904

    Par défaut

    Ben non.

    Si exec réussit, le code du process est remplacé et sa fonction main est lancée, exec retourne une valeur uniquement si la fonction échoue et que le code du process n'est donc pas remplacé. Comme le fil d’exécution change en cas de réussite de exec, l'ancien fil d’exécution de l'ancien code contenu dans le process est perdu.

    Le programme enfant sera considéré comme terminé par le père lorsqu'il recevra un signal SIGCHLD.

    wait() attend des signaux précis, pas uniquement la fin de process. voir le mzn de wait
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. [Fortran 95] Comment exécuter mon programme ?
    Par silver2 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/01/2007, 17h15
  2. Réponses: 2
    Dernier message: 13/12/2006, 14h48
  3. [UBUNTU] Comment exécuter le programme Latex ?
    Par Keuf95 dans le forum Ubuntu
    Réponses: 1
    Dernier message: 11/08/2006, 18h54
  4. Comment exécuter un programm
    Par Murieyaya dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 11h50
  5. Comment exécuter un programme externe ?
    Par spikto dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2005, 17h18

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