[Perl] Probleme avec Fork

Probleme avec Fork [Perl] - Perl - Programmation

Marsh Posté le 08-01-2006 à 21:10:30    

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;

Reply

Marsh Posté le 08-01-2006 à 21:10:30   

Reply

Marsh Posté le 09-01-2006 à 00:33:39    

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
Reply

Marsh Posté le 09-01-2006 à 02:05:18    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed