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:
Evidemment, ça ne marche pas.
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; }
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 !!!
Partager