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

Programmation et administration système Perl Discussion :

Problème de FORK


Sujet :

Programmation et administration système Perl

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 48
    Points
    48
    Par défaut Problème de FORK
    Bonjour,

    Je travaille sur une application TK.

    J'ai besoin de fork pour pouvoir lancer des fonctions durant l'exécution d'une autre.

    Ma fonction ressemble à ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sub fonction(){
       while (boucle non infinie){
           #traitement de la fonction
           unless (fork){
               fonction2();
           }
           wait; #Je veux que la fonction2 soit terminée
       }
    }
    Quand j'exécute, mon programme s'arrête net à l'instruction unless(fork).
    Il ne veut pas exécuter le fork et je ne comprend pas pourquoi.

    J'ai testé le fork dans un fichier vierge, ça marchait.
    Mais quand je l'inclus à mon programme, ça ne fonctionne plus.

    Vous avez une idée?

    Merci,
    Lucie

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    J'ai dans l'idée que le fork() fonctionne, mais que tu ne l'utilises pas correctement, par exemple tu n'arrêtes pas le fils après avoir exécuté fonction2(), en plus j'ai du mal à voir l'intérêt du fork() si tu attends simplement dans le père que le fils ait fini... Autant appeler fonction2() dans le père directement !!

    --
    Jedaï

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    Je travaille sous une appli.

    quand je lance ma 1e fonction, elle bloque tout et ne rend la main qu'à la fin de son exécution.
    J'ai besoin de reprendre la main pendant son exécution pour exécuter d'autres fonctions et "naviguer" dans mon application.

    J'ai trouvé qu'un seul moyen pour faire ça, utiliser les fork mais ça ne fonctionne toujours pas...

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Mais si ça fonctionne, c'est juste que tu ne les utilises pas bien (comme les threads d'ailleurs), tu ne sembles pas très expérimenté en parallélisme, en bref... Fondamentalement, il ne faut pas que tu utilises d'appels bloquants, il faut juste que tu vérifies périodiquement si le fork a terminé (ou du moins donné quelques résultat, et à ce moment là et à ce moment là seulement tu récupères les résultats et tu récupères le fils.

    --
    Jedaï

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    En effet, je ne suis pas experte.

    Et je ne comprends pas concrétement comment je peux coder ce que vous m'avez expliqué.

    Je suis un peu perdue là.

    Lucie

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est plus une question d'expérience que d'expertise.
    Sur quel OS travailles-tu ?

    --
    Jedaï

  7. #7
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Je vais t'expliquer (rapidement bien entendu) le fonctionnement de la fonction fork. Elle sert à créer deux processus, comme tu as dû le comprendre. Le plus important avec cette fonction, c'est son retour. En effet, elle ne retourne pas la même chose au processus père qu'au processus fils. Au père, elle retourne le pid (processus identifier) du fils ; au fils, elle retourne 0.
    Voici un exemple classique de son utilisation :

    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
    if (not defined (my $pid = fork()))
    {
       die "Problème de fork";
    }
    elsif ($pid == 0)
    {
       #on est ici dans le processus fils
       #on fait un traitement (1)...
       exit 0; #on ferme le processus en renvoyant la valeur 0 !!!
    }
    else
    {
       #on est ici dans le processus père
       # le pid du fils est dans la variable $pid
       #on fait un traitement (2)...
       waitpid($pid, 0); #on attend que le processus fils soit fini !
    }
    Note bien que les traitements (1) et (2) s'exécutent en parallèle .
    Dans l'exemple que tu as donné, comme Jedai te l'a expliqué, le fork ne sert à rien ! Aucune tache n'est parallélisé vu qu'à peine ton processus fils créé, le père attend la fin de con exécution !

    Je crois comprendre que tu as lu l'exemple de la FAQ, ce qui est très bien. Mais ce que tu ne sais peut être pas, c'est que la fonction exec écrase le code du processus courant et le remplace par celui qu'il appelle.
    Donc dans l'exemple de la FAQ, dès que l'exécution de ls se termine, le processus fils se termine également, et le processus père (qui attendait son fils) peut continuer.

    J'espère avoir était clair, si ce n'est pas le cas, n'hésite pas à poser des questions
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 48
    Points
    48
    Par défaut Arrêt intempestif de mon programme au FORK()
    Bonjour,

    Merci, j'ai en effet mieux compris mon erreur.

    Par contre, j'ai toujours le problème d'arrêt net de l'exécution de mon programme quand je fais mon fork.

    Mon programme donne ça maintenant :

    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
     
    #lancement de la commande durant 20 mins
    #par le telnet
    while (#il y a un flux d'affichage à l'écran){
       my $pid=fork();
       if ($pid == 0){
          #Je lance régulièrement une fonction secondaire
          #qui lance une autre commande sur un autre telnet
          #et affiche le résultat dans mon application
          fonction2();
       }else{
          waitpid($pid,0);
          #je lis une partie de mon flux
          $ligne = flux....
       }
    }
    #J'affiche dans mon application le résultat
    #de la lecture de flux de ma fonction
    #durant 20 minutes
    Mon programme s'arrête au FORK(), et arrête son exécution.
    Je ne comprends pas pourquoi.

    Merci,
    Lucie

Discussions similaires

  1. Problème synchronisation fork()
    Par Nicoclem dans le forum C
    Réponses: 2
    Dernier message: 12/06/2008, 19h34
  2. probléme avec fork()
    Par yous18 dans le forum C
    Réponses: 38
    Dernier message: 08/03/2008, 12h21
  3. problème avec fork et execvp !
    Par julien.cousineau dans le forum Linux
    Réponses: 0
    Dernier message: 08/10/2007, 00h38
  4. Problème de fork en //
    Par soad029 dans le forum POSIX
    Réponses: 10
    Dernier message: 07/01/2007, 21h29
  5. [Perl]problème avec fork
    Par LE NEINDRE dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 23/09/2005, 16h31

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