Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pipe anonyme, 1 écrivain, n lecteurs

1 réponse
Avatar
Edouard.Gaulue
Bonjour,

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 ?

Merci pour vos réponses, EG

1 réponse

Avatar
Edouard.Gaulue
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.

#!/usr/bin/perl

use POSIX;

$|=1;

$nb_test_elem0;
$nprocs_ftp=5;
$width=8;

pipe READER, WRITER ;
select((select(WRITER),$|=1)[0]);

$i=0;

while (1) {

if ( $nb_procs < $nprocs_ftp ){

undef $pidfils;

unless($pidfils=fork) {
$|=1;
close WRITER;
while ( sysread READER, $indice,$width ) {
print "$$:".($i+1).":$indicen";
sleep ($i+1);
}
close READER;
exit 5 ;
}

if(defined($pidfils) && ($pidfils>0)) {
$nb_procs++;
print ( "$pidfils ($nb_procs) child process startedn");
}
else {
print "Error starting child process $pidfilsn";
}

}

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;