[bcn-pm] Pregunta sobre open2

Alex Muntada alexm at ac.upc.es
Fri Apr 23 10:43:53 CDT 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

* Xavi Planas:  [2004-04-23/13:35:29 +0200]

> a partir dels teus sugeriments he intentat seguir la
> sol·lució dels named pipes, però sense sort. El tema
> és que no sóc capaç de processar cap tipus de sortida.

Ben mirat, crec que aquesta solució que et proposava té
d'altres inconvenients que tampoc la fan adequada: les
pipes tenen l'inconvenient que no pots obrir-les en mode
escriptura sense bloqueig (falla amb l'error ENXIO). Això
vol dir que cal obrir la "sortida" en mode bloqueig i que
aleshores no s'executa el servidor fins que algú l'obri
en mode lectura. La conseqüència és un retard en la càrrega
del servidor.

D'altra banda, si el servidor tanca el canal d'entrada quan
detecta l'EOF i acaba (com en el cas de la comanda cat),
tampoc servirà. Per exemple, si l'execució de la línia
següent no es bloqueja, la solució de les pipes tampoc et
servirà:

  % echo foo|servermanager
  ...està bloquejat...
  ^C
  %

En definitiva, que jo em plantejaria seriosament reescriure
el servidor, bé sigui per a fer-lo més eficient en la càrrega
de les dades o per a daemonitzar-lo convenientment. Insisteixo,
sense tenir més informació sobre el tipus de servidor, què fa,
com i d'on agafa les dades, en què està programat, si tens el
codi disponible, etc. es fa molt difícil de poder-te ajudar.

> És correcte el meu script? Enfoco malament la teva
> sugerència? Alguna altra idea?

L'exemple que us he enviat només fèia la part de preparar el
servidor per tal que utilitzés les pipes. La part del client
cal fer-la a part.

En qualsevol cas, hi ha un parell de coses que et volia comentar
sobre el codi:

> open (FIFO_LECT, "LECT");
> open (FIFO_ESCR, "ESCR");
>
> ...
>
> *STDOUT=*FIFO_ESCR;
> *STDIN=*FIFO_LECT;

Una forma correcta de tancar i obrir els canals 0 i 1 associats
a les pipes és la següent:

  open STDIN, "<LECT";
  open STDOUT, ">ESCR";

Tal com ho fas tú, els canals associats no són el 0 i l'1 sinó
el 3 i el 4, amb tota probabilitat.

> if ( my $pid=fork() ) {
>
> ...
>
> }else {
> 
> print FIFO_LECT  "COMANDA SERVERMANAGER\n";
> while ( <FIFO_ESCR> ) { print $_; }
> print FIFO_LECT  "COMANDA2 SERVERMANAGER\n";
> ....
> }

Això no té sentit fer-ho aquí. La idea és que, per un costat,
executis el servidor com una mena de daemon (encara que no ho
sigui estrictament) i executis les peticions a part, des d'un
altre script.

> El Server Manager no el puc customitzar, miraré amb
> carinyo el que hem comentes sobre dimonitzar el
> procés, però això hem sol·lucionarà el problema de
> processament d'entrada i sortida tenint en compte que
> únicament puc executar-lo?

No entenc que vols dir amb això de què només pots executar-lo.
Vols dir que és un binari del qual no tens el codi i què no
saps què fa?

- --
Alex Muntada <alexm at ac.upc.es>
http://people.ac.upc.es/alexm/

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)

iD8DBQFAiTmmLdxCGS3zaBERAhQdAKDeEDHN5GhlEMR2KWn/EkYzjwpM7QCfQZRj
GwUUHN9oy4DPEynd6GozFts=
=lCeO
-----END PGP SIGNATURE-----



More information about the Barcelona-pm mailing list