OVH Cloud OVH Cloud

Ouvrir un pipe en lecture et ecriture ?

2 réponses
Avatar
Winston Smith
Bonjour a tous,

Je cherche a savoir s'il est possible d'ouvrir un pipe a la fois en
lecture et en ecriture ? Ce que je voudrais, c'est faire un truc du
genre :

open(FILTRE, '| monprogramme |');
while (<>) {
print FILTRE, $_;
my $result = <FILTRE>;
print STDOUT, $result;
}

J'ai simplifie un peu mais l'idee est que je voudrais donner des lignes
une par une a mon programme et lire la sortie au fur et a mesure (parce
que la sortie du programme pour chaque ligne influence les lignes
suivantes en entree).

Si quelqu'un sait faire ca, je lui serais tres reconnaissant.

@+

Winston

2 réponses

Avatar
Paul Gaborit
À (at) Fri, 05 Nov 2004 16:11:04 GMT,
Winston Smith écrivait (wrote):
Je cherche a savoir s'il est possible d'ouvrir un pipe a la fois en lecture et
en ecriture ?


Ce n'est pas facile à gérer (en gros si on ne sait pas faire d'écriture non
bloquante, il y un risque de tomber sur un interblocage si on ne maîtrise pas
le fonctionnement du soft en face). Ce n'est donc pas prévu par défaut en
Perl.

Ce que je voudrais, c'est faire un truc du
genre :

open(FILTRE, '| monprogramme |');
while (<>) {
print FILTRE, $_;
my $result = <FILTRE>;
print STDOUT, $result;
}

J'ai simplifie un peu mais l'idee est que je voudrais donner des lignes une
par une a mon programme et lire la sortie au fur et a mesure (parce que la
sortie du programme pour chaque ligne influence les lignes suivantes en
entree).



Lisez 'perlipc' :

perldoc perlipc

ou (en français pour perl 5.6.0) :

<http://www.enstimac.fr/Perl/DocFr/perlipc.html>

en particulier la partie sur les communications bi-directionnelles.

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Laurent Wacrenier
Winston Smith écrit:
Je cherche a savoir s'il est possible d'ouvrir un pipe a la fois en
lecture et en ecriture ? Ce que je voudrais, c'est faire un truc du
genre :

open(FILTRE, '| monprogramme |');


Là tu aurais deux pipse (un en lecture et un en écriture)

Pour ça, utilise

perldoc IPC::Open2
(et IPC::Open3)