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 89 90 91 92
|
#!/usr/bin/perl -w
use strict ;
use warnings ;
use IO::Pipe ;
use IO::Select ;
my $nb_fork = '3' ; # Nombre de fois que le script sera dupliqué => nbre de connections simultanées
my %donnees_contacts ; # Hachage de hachage contenant les informations des contacts (date de dernière maj, nb d'articles et de comms)
################################################################################
my @liste = ('eins', 'zwei', 'drei', 'vier', 'funf', 'sechs', 'sieben', 'acht', 'neun', 'zehn') ;
print " <-- @liste -->\n" ;
################################################################################
my $pid = '-1' ;
my $i = '0' ;
my @tabPipesPereFils ; # Communication du père vers ses fils
my @tabPipesFilsPere ; # Communication des fils vers leur père
# Clonage du prog
for ($i = '0' ; $i < $nb_fork and $pid != '0' ; $i++)
{ push @tabPipesPereFils, new IO::Pipe;
push @tabPipesFilsPere, new IO::Pipe;
$pid = fork () ;
}
################################################################################
if (defined ($pid) and $pid > '0') # Processus père
{ print "On est entré dans le cas du père\n" ;
my $s = IO::Select->new();
# Mise en lecture/écriture des tubes et création de la liste d'écoute
for ($i = 0 ; $i < $nb_fork ; $i++)
{ $tabPipesPereFils[$i]->writer () ;
$tabPipesFilsPere[$i]->reader () ;
$s->add ($tabPipesFilsPere[$i]) ;
}
print "P : Attente de demande des fils\n" ;
while (wait () >= '0' and my @ready = $s->can_read ()) # On attend soit la fin des fils, soit l'arrivée de données
{ foreach my $fils (@ready)
{ my $ligne = <$fils> ;
next unless (defined $ligne) ;
print "P reçoit ==> $ligne" if (defined ($ligne)) ;
if ($ligne =~ /(\d+) : \+{3}/)
{ my $f = $1 ;
my $adresse = shift @liste ;
print {$tabPipesPereFils[$f]} "$adresse\n" ;
print "P reçoit => Ecriture de $adresse dans le tube n°$f\n" ;
}
}
}
print "Tous les fils ont fini, on sort du père\n" ;
}
elsif (defined ($pid)) # Processus fils
{ $i-- ;
$tabPipesPereFils[$i]->reader () ;
$tabPipesFilsPere[$i]->writer () ;
my $entree = $tabPipesPereFils[$i] ;
# my $s = IO::Select->new();
# $s->add ($tabPipesPereFils[$i]) ;
print "On est dans le fils n°$i\n" ;
# Le fils demande du boulot à son père
print {$tabPipesFilsPere[$i]} "$i : +++\n" ;
# my @ready = $s->can_read () ;
{
# my $ready = shift @ready ;
my $adresse = <$tabPipesPereFils[$i]> ;
die unless (defined ($adresse)) ; # On quitte si rien n'a pu être lu
print "F$i reçoit : $adresse\n" ;
# Informe le père que le fils a fini son travail et le père lui renvoie une nouvelle tache
print {$tabPipesFilsPere[$i]} "$i : +++\n" ;
}
} |
Partager