Newsgroup: it.comp.os.linux.development
Titolo: ancora su POPEN

Provo a riformulare meglio la domanda del mio post precedente.
Devo mandare su stdin di un processo A lo stdout di un processo B.
Se uso popen, devo aspettare che il processo B sia terminato (e il suo
stdout sia bufferizzato completamente, in A), prima di avere a disposizione
il suo stdout.
Ma non è questo che voglio: io voglio che A legga (ed elabori) , in maniera
ASINCRONA, ad esempio 5 caratteri per volta da B, mentre B è in esecuzione
PER CONTO SUO...
come posso fare?
thnks
Paolo
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

read, fork, execl, pipe, dup2
google è pieno, purtroppo 'ste cose le ho fatte con kylix e non ho sottomano
1 spezzo in c
Bye,
Raktzo

 come posso fare?
te la butto li senza pensdarci troppo (sono di fretta), hai pensato ad una
named pipe?
ciao

 Paolo
Non credo che popen vada bene. Come affermi tu l' IO NON DEVE essere
bufferizzato e quindi popen che restituisce un FILE * non va bene.
Secondo me invece di usare artifizi, espedienti e workarond disperati
fasi meglio a usare pipe(2) che e' piu' a basso livello, ma una volta
capita e approntato del codice per metterla sotto controllo diviene
un investimento per il futoro. Non ho con me i miei esempi in C
dell 'uso di pipe(2), quando rientro a casa te ne posto 1, del resto
ultimamente uso quasi esclusivament Perl e in perldoc perlipc provi
l' esempio ben comprensibile.
Attenzione che pipe valida un suo argomento array di interi a descrittori
di files uno in scrittura e uno il lettura COLLEGATI TRA LORO. A quindi
poco senza che la bocca parli con l' orecchio, si deve usare fork() per
aprire un nuovo processo, dove potrai con dup2 ridefinire stdin e stdout,
fare execve di un altro programma ecc..
per ora vedi se puoi dedurre qualcosa da questo estratto di perldoc perlipc
che e' l' unica cosa che ho sotto mano.
           #!/usr/bin/perl -w
           # pipe1 - bidirectional communication using two pipe pairs
           #         designed for the socketpair-challenged
           use IO::Handle;     # thousands of lines just for autoflush :-(
           pipe(PARENT_RDR, CHILD_WTR);                # XXX: failure?
           pipe(CHILD_RDR,  PARENT_WTR);               # XXX: failure?
           CHILD_WTR->autoflush(1);
           PARENT_WTR->autoflush(1);
           if ($pid = fork) {
               close PARENT_RDR; close PARENT_WTR;
               print CHILD_WTR "Parent Pid $$ is sending this\n";
               chomp($line = <CHILD_RDR>);
               print "Parent Pid $$ just read this: `$line'\n";
               close CHILD_RDR; close CHILD_WTR;
               waitpid($pid,0);
           } else {
               die "cannot fork: $!" unless defined $pid;
               close CHILD_RDR; close CHILD_WTR;
               chomp($line = <PARENT_RDR>);
               print "Child Pid $$ just read this: `$line'\n";
               print PARENT_WTR "Child Pid $$ is sending this\n";
               close PARENT_RDR; close PARENT_WTR;
               exit;
           }
ci sarebbe ancora molto da dire, ad esempio sull' uso di select(2), ma non
voglio divagare troppo oltre la tua richiesta originale. comunque popen(3)
non va per te.
ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it