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

Shell et commandes GNU Discussion :

Comment arrêter un processus récursif après la création de 3 enfants ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut Comment arrêter un processus récursif après la création de 3 enfants ?
    Bonjour,
    je suis entrain de créer des processus fils et petit fils en bash ,mais j'utilise la récursivité et je voulais l’arrête au moment ou j'ai généré les 3 enfants

    code parent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #! /bin/bash
     
     
     
    ./enfant & 
    	sleep 0.5
    code enfant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	echo "[$$][$PPID]"
     
    ./agent6 & 
    sleep 0.5
    je veux vraiment de l'aide j'ai cherché mais j'arrive pas

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    De ce que j'en comprends ce n'est pas du C mais du bash qui créé les processus ?
    Dans ce cas regarde du côté de la commande "ps" qui te retournera la liste des processus tournant actuellement.
    Tu pourras faire un "grep" dessus pour récupérer uniquement les processus t'intéressant et tu n'as plus qu'à les compter.

  3. #3
    Membre Expert Avatar de Ti-Slackeux
    Homme Profil pro
    Robotique
    Inscrit en
    Août 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Robotique

    Informations forums :
    Inscription : Août 2007
    Messages : 905
    Par défaut
    Bonjour,

    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $! > /var/run/program.pid
    il suffit ensuite de kill le pid voulu.

    Bonne journée

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    ps ne sert à rien là...

    L'exemple donné nous montre un parent qui crée un fils qui lui même crée un fils... tu parles de trois fils, c'est pas très clair entre un père, un fils et un petit fils...

    Sinon, pour arrêter ta récursivité, c'est le même principe que pour la factoriel ou fibonacci, tu passes à ton/tes script un paramètre genre compteur que le script incrémente (ou décrémente) et celui-ci ne lance plus de fils quand le compteur a atteint sa limite.

    d'ailleurs, chacun des pères devrait aussi attendre que les fils soit fini avant de mourir: vois du coté de la commande wait.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut
    bonjour,
    merci de ta réponse j'ai fais comme le factoriel
    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
    agent6()
    {
     
    local i=$1
     
    echo "[$$][$PPID]"
    if [ $i -eq 0 ]
    then 
    exit O
    else
     
    	agent6 $(( i - 1))
     
    fi
     
     
    }
     
     
    agent6 $1

    mais quand je compile il ne se rappel pas récursivement

    j'ai ça

    [50483][56689]
    [50483][56689]
    [50483][56689]
    ./agent6: ligne 10 : exit: O : argument numérique nécessaire

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Il ne faut pas confondre O et 0.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Et exit, c'est violent, en plus ici, ça ne sert pas à grand chose car la fonction ne crée pas de fils...

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et exit, c'est violent, en plus ici, ça ne sert pas à grand chose car la fonction ne crée pas de fils...
    bonjour,
    oui c'est ça il créer pas de petit fils
    tu peux proposé quelque chose

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Un exemple:
    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
    $ fn1(){
    echo $1
    if [ $1 -gt 0 ] 
    then
      fn1 $(($1-1)) &
      jobs -l
      sleep 3
      wait
    fi
    }
    $ fn1 4
    4
    [1] 28131
    [1]+ 28131 En cours d'exécution   fn1 $(($1-1)) &
    3
    [1]+ 28133 En cours d'exécution   fn1 $(($1-1)) &
    2
    [1]+ 28135 En cours d'exécution   fn1 $(($1-1)) &
    1
    [1]+ 28137 En cours d'exécution   fn1 $(($1-1)) &
    0
    [1]+  Fini                    fn1 $(($1-1))
    Le sleep n'est là que pour faire beau, le wait est je dirais indispensable, et toi quand tu fais l'appelle de la fonction, tu ne dois pas l'appeler pas en background.
    La commande jobs ne sert qu'à montrer le fork

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295
    Par défaut
    Bonjour

    STOOOP ! Tu ne fais pas un processus récursif, mais une fonction récursive. Ce n'est pas très malin d'appeler le script exécutable et la fonction du même nom si tu veux les différencier. Le processus du script est donc unique et ne change pas. Tout est normal.

  11. #11
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut
    Bonjour,
    merci de votre réponse c'est possible que vous me proposé un processus récursif

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2015
    Messages : 10
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Un exemple:
    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
    $ fn1(){
    echo $1
    if [ $1 -gt 0 ] 
    then
      fn1 $(($1-1)) &
      jobs -l
      sleep 3
      wait
    fi
    }
    $ fn1 4
    4
    [1] 28131
    [1]+ 28131 En cours d'exécution   fn1 $(($1-1)) &
    3
    [1]+ 28133 En cours d'exécution   fn1 $(($1-1)) &
    2
    [1]+ 28135 En cours d'exécution   fn1 $(($1-1)) &
    1
    [1]+ 28137 En cours d'exécution   fn1 $(($1-1)) &
    0
    [1]+  Fini                    fn1 $(($1-1))
    Le sleep n'est là que pour faire beau, le wait est je dirais indispensable, et toi quand tu fais l'appelle de la fonction, tu ne dois pas l'appeler pas en background.
    La commande jobs ne sert qu'à montrer le fork

    merci pour ta réponse ca m'as aidé a le faire en process

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/01/2016, 11h20
  2. [Débutant] Comment changer la connectionString aprés la création du setup ?
    Par hamza_azerty dans le forum C#
    Réponses: 2
    Dernier message: 21/01/2015, 23h01
  3. Réponses: 7
    Dernier message: 04/05/2011, 21h26
  4. Réponses: 0
    Dernier message: 02/08/2007, 14h31

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