Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
580 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Probleme avec Fork

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Perl] Probleme avec Fork

n°1279261
batch_warr​ior
Posté le 08-01-2006 à 21:10:30  profilanswer
 

Bonsoir,
 
je débute en perl, donc ma question vous paraitra peut-être bête!
Je veux simplement créer un processus fils qui toutes les x secondes va réaliser un bout de code. Je mets donc un sleep 10 dans au niveau du code du fils, mais du coup il n'arrive jamais à prendre la main. Sans le sleep, j'obtiens sur la sortie standard une serie de 100 b puis 100 a ... (lié au scheduler, ça me va), par contre avec le sleep, j'obtiens que des a.
 
Avez vous une solution pour faire en sorte que le fils prenne aussi la main de temps en temps? Le but final est d'interroger un serveur et lui demander l'envoi d'un hash sur un fichier.
 
Merci d'avance
 
voilà mon code:
 

Code :
  1. use strict;
  2. sub pere
  3. {
  4.    while (1){
  5.      print "a";
  6.    }
  7. }
  8. sub fils
  9. {
  10.    while (1){
  11.      print "a";
  12.      #sleep 10;
  13.    }
  14. }
  15. sub test_fork
  16. {
  17.    my $pid;
  18.    if ($pid = fork){
  19.       pere($pid);
  20.    }
  21.    elsif (defined($pid)){
  22.    fils;
  23.    }else { print "Erreur de Fork\n";}
  24. }
  25. test_fork;

mood
Publicité
Posté le 08-01-2006 à 21:10:30  profilanswer
 

n°1279376
batch_warr​ior
Posté le 09-01-2006 à 00:33:39  profilanswer
 

j'ai réussi à faire ce que je voulais dans ce cas assez simple. Mais je ne vois pas comment faire pour généraliser. La j'arrive à afficher 3 valeurs différentes en factorisant un petit peu le code, mais j'aimerais arriver à faire une fonction qui prend en parametre le nombre de valeurs à afficher et qui arrive au mm resultat que le code ci-dessous mais sans devoir créer à l'avance l'architecture de la fonction pour n valeurs. Enfin bref, éviter de faire n branches avec des if et while pour afficher x valeurs. Avez-vous une idée?
 
Peut-etre du côté de la recurrence, mais je m'y connais pas des masses  :sweat:  
 
voilà le code qui marche pour l'affichage de 3 valeurs différentes:
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. sub test_fork
  4. {
  5.    my $pid;
  6.    my $pid2;
  7.    if ($pid = fork){
  8.        while (1){
  9.  sleep 1;
  10.  print "a\n";
  11.        }
  12.    }
  13.    elsif (defined($pid)){
  14.        while (1){
  15.    if ($pid2 = fork){
  16.        while (1){
  17.   sleep 1;
  18.   print "b\n";
  19.        }
  20.    }
  21.    elsif (defined($pid2)){
  22.        while (1){
  23.   sleep 1;
  24.   print "c\n";
  25.        }
  26.    }
  27.        }
  28.    }
  29.    else {print "Erreur de Fork\n";}
  30. }
  31. &test_fork;


Message édité par batch_warrior le 09-01-2006 à 00:48:29
n°1279398
Danjer
Posté le 09-01-2006 à 02:05:18  profilanswer
 

Ce que tu cherche a faire est, a mon avis, fou.  
 
En fait tu te poses un probleme qui n'existe pas (J'ai beaucoup aime la partie sur le scheduler). J'ai modifie un petit peu ton code pour que tu comprennes pourquoi.
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. sub test_fork {
  4. my $pid;
  5. my $pid2;
  6. my $i = 0;
  7. if ($pid = fork()){
  8.   while (1){
  9.    sleep 1;
  10.    print "a";
  11.    print "\n" unless $i++ % 2;
  12.   }
  13. }
  14. elsif (defined($pid)){
  15.   while (1){
  16.    if ($pid2 = fork()){
  17.     while (1){
  18.      sleep 1;
  19.      print "b";
  20.      print "\n" unless $i++ % 5;
  21.     }
  22.    }
  23.    elsif (defined($pid2)){
  24.     while (1){
  25.      sleep 1;
  26.      print "c";
  27.      print "\n" unless $i++ % 10;
  28.     }
  29.    }
  30.   }
  31. }
  32. else {print "Erreur de Fork\n";}
  33. }
  34. &test_fork;


 
Si tu utilises print pour afficher quelque chose la chaine est stockee dans un buffer (pour eviter de faire des appels systemes trop frequents). Lorsque le buffer est plein ou si celui-ci contient un '\n', le buffer est flushe.
 
Rajoute ceci en haut du script juste apres le 'use scrict';  

Code :
  1. $| = 1;


 
Tu pourras mediter en changeant les valeurs de $|.


Message édité par Danjer le 09-01-2006 à 02:07:45

---------------
Cdl, Danjer

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Perl] Probleme avec Fork

 

Sujets relatifs
Probleme de Compilation C++Probleme affichage liens CSS...
problème compilation fortran-Lahey!!!probleme du transfert d'un fichier
probleme avec dev cpp[REGLE] Problème d'insertion dans une base MySql
Probleme en C#: Ouvrir une Form a partir d'un bouton d'une autre FormGros et bizzare probleme
Probleme avec Dreamweaver 8 (Includes php)[Perl] Probleme de fork & serveur socket
Plus de sujets relatifs à : [Perl] Probleme avec Fork


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR