Bonjour à tous,

Voià, j'essaie de comprendre fork et pipe pour lancer plusieurs processus (fork) et communiquer en eux (pipe) mais je suis long à la détente et j'ai du mal.
J'ai réaliser un petit script qui calcul des codes héxadécimaux sur 6 caractères. Je veux tester la validité de mon script en lançant 100000 fois la fonctions par exemple.

Le script qui suit fait deux choses (mais très mal puisque ça marche pas ) ;

- Boucles qui calcul les codes
- Insertion des codes dans un tableau
- Vérification des doublons (s'il y a des codes identiques)

En parallèle, un processus (le père normalement), lit à intervalle régulier (1 seconde), les données qui sont écrites par le fils sur un pipe et affiche sur la sortie standard ce qu'il lit sur le pipe.

Voici le script:
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
#!c:\perl\bin\perl.exe
use IO::Handle ;
 
if($ARGV[0] eq '')
{
    print "Il faut rentrer un nombre de tentatives";
}
else
{
      $tentative=$ARGV[0];
      pipe ( LIRE , ECRIRE ) ;
      ECRIRE -> autoflush ( 1 ) ;
      if($pid = fork)
      {
          #Le pere
          close ECRIRE;
          &LirePipe();
          close LIRE;
      }
      #Le fils
      else
      {
            $code=&Generate();
 
            close(LIRE);
            for (my $i=0;$i<$tentative;$i++)
            {
                  $code=&Generate();
                  &verif($code);
                  push(@result,$code);
                  $num=$i;
                  print ECRIRE "$code";
            }
            close ECRIRE;
            foreach my $keys(keys %Trouve)
            {
                  print "$keys: trouve $Trouve{$keys} fois\n";
            }
      }
 
}
sub LirePipe()
{
    $lu=<LIRE>;
    if ($lu ne "")
    {
          print "$lu\n";
    }
    else
    {
          exit(0);
    }
    sleep(1);
    &LirePipe();
}
 
sub verif()
{
      $code_en_cours=$_[0];
      foreach(@result)
      {
            if($code_en_cours eq $_)
            {
                $Trouve{$code_en_cours}++;
            }
      }
}
 
sub Generate()
{
    my @tab;
    my @tab2;
    my $code;
    for($i=48;$i<=57;$i++){push(@tab,$i);}
	  for($i=65;$i<=90;$i++){push(@tab,$i);}
	  for($i=97;$i<=122;$i++){push(@tab,$i);}
	  #$tab2[0]=chr($tab[Math.round((Math.random()*tab.length))]);
    $tab2[0]=chr($tab[sprintf("%0d",rand()*($#tab+1))]);
    for($i=1;$i<6;$i++)
	  {
      $recur=ord($tab2[$i-1])%($#tab+1);
      $indice=sprintf("%0d",rand()*($#tab+1));
      $tab2[$i]=chr($tab[($recur+$indice)%($#tab+1)] );
  }
$code=join("",@tab2);
return $code;
}
Evidemment, ça ne marche pas.
J'arrive bien à lire sur le pipe mais j'affiche tout d'un coups, et à la fin du script( c'est à dire quand la boucle qui calcule tous les codes s'achèvent)
Pourquoi ? COmment remedier à ce problème ?
Est-ce que j'utilise la bonne méthode ?

Merci pour vos éclaircissement, j'aimerai bine mieux comprendre ces notions !!!