Je suis à la recherche d'info sur la fonction pipe de perl, suite à ce
test :
- ouverture d'un pipe
- ecriture dans le pipe (avec $|=1)
- fork 1
boucle :
* lecture du pipe et affichage
* attente aleatoire
sortie
- fork 2
boucle :
* lecture du pipe et affichage
* attente aleatoire
sortie
- père
boucle :
*lecture du pipe et affichage
* attente aleatoire
sortie
Si j'écris dans mon pipe :
aze
qsd
wxc
J'obtiens en sortie 3 fois le texte entré (dans l'ordre où non). Or,
je croyais qu'après un fork, les descripteurs des fils et celui du
père pointaient vers le même compte. Bilan, je pensais qu'une valeur
lu par un des process ne pouvait pas être lu par un autre à cause de
l'incrémentation du compte à chaque lecture.
Est-ce que je me trompe ?
Si oui comment faire ? Si non, pourquoi ca marche pas ? Implementation
de pipe dans perl ? Est-ce que ca marchera avec un pipe nomé ? Où
trouver de la doc pour en savoir plus ?
if ($i<$nb_test_elem) { syswrite WRITER,sprintf("%${width}.0d",$i); $i++; } elsif ($i==$nb_test_elem) { close WRITER; print "!!! Close father WRITER !!!n"; $i++; }
if ($pid=waitpid(-1, &WNOHANG)) { $exit_value = $? >> 8; print "i=$i et proc=$nb_procs et $pidn"; if ($pid > 0) { $nb_procs--; print("Lost child process $pid ($exit_value) ! (steel have $nb_procs)n"); } if ($exit_value == 5 and $i > $nb_test_elem ) {print "Received exit valuen";last;} }
} # End while(1) close READER;
Voici une solution si certains on un jour les memes besoins mais c'est
avec du sysread et syswrite : j'ai pas reussi a faire autrement.
if ($i<$nb_test_elem) {
syswrite WRITER,sprintf("%${width}.0d",$i);
$i++;
}
elsif ($i==$nb_test_elem) {
close WRITER;
print "!!! Close father WRITER !!!n";
$i++;
}
if ($pid=waitpid(-1, &WNOHANG))
{
$exit_value = $? >> 8;
print "i=$i et proc=$nb_procs et $pidn";
if ($pid > 0) {
$nb_procs--;
print("Lost child process $pid ($exit_value) ! (steel have
$nb_procs)n");
}
if ($exit_value == 5 and $i > $nb_test_elem ) {print "Received
exit valuen";last;}
}
if ($i<$nb_test_elem) { syswrite WRITER,sprintf("%${width}.0d",$i); $i++; } elsif ($i==$nb_test_elem) { close WRITER; print "!!! Close father WRITER !!!n"; $i++; }
if ($pid=waitpid(-1, &WNOHANG)) { $exit_value = $? >> 8; print "i=$i et proc=$nb_procs et $pidn"; if ($pid > 0) { $nb_procs--; print("Lost child process $pid ($exit_value) ! (steel have $nb_procs)n"); } if ($exit_value == 5 and $i > $nb_test_elem ) {print "Received exit valuen";last;} }