PDA

View Full Version : [C] Linux pipe


Teo@Unix
03-04-2010, 13:56
Ciao, c'è un metodo per mettere in pausa il processo principale in attesa che il processo filgio avviato con la funzione popen() ha terminato?

Oppure occorre fare manualmente con fork() ecc..? Nel mio caso si tratta di meno di mezzo secondo però mi scoccia mettere usleep(500000) dopo popen() per evitare errori di visualizzazione sul terminale.
Inolter il valore di usleep() potrebbe non andate bene su altri sistemi magari più lenti.

Non ho cercato molto a dire il vero, sapete consigliarimi? Grazie.

clockover
03-04-2010, 14:27
Ciao non ho mai utilizzato popen ma per sincronizzare dei processi puoi sempre utilizzare un semaforo! Almeno è sicuro che c'è sincronia!

cionci
03-04-2010, 14:38
Mettiti in lettura sulla pipe, no ?

Teo@Unix
03-04-2010, 14:46
Ciao non ho mai utilizzato popen ma per sincronizzare dei processi puoi sempre utilizzare un semaforo! Almeno è sicuro che c'è sincronia!

che io sappia questo credo di non poterlo fare popen() fa una fork e scrive su una pipe tutto da solo poi termina.


Mettiti in lettura sulla pipe, no ?

questo credo di si,
l'ultimo programma in cui l'avevo usata avevo scritto:

FILE*ps_out=popen("ls /proc | grep -v -e [a-z] | sort -n 2>/dev/null","r");
if(ps_out==NULL) {
perror("popen");
exit(1);
}

se non erro questo già mi bloccherebbe giusto?

EDIT: certo che se lo provo mi accorgo no? :D

Teo@Unix
03-04-2010, 15:41
e no...

snip:

out = popen("cat title","w");
if(out <= 0) error(PIPE,NULL);

printf.....


mmm praticamente stampa sullo schermo il file title... però il risultato finale è che prima viene visualizzato ciò che stampa la printf seguente....

marco.r
03-04-2010, 16:02
Ciao, c'è un metodo per mettere in pausa il processo principale in attesa che il processo filgio avviato con la funzione popen() ha terminato?

Oppure occorre fare manualmente con fork() ecc..? Nel mio caso si tratta di meno di mezzo secondo però mi scoccia mettere usleep(500000) dopo popen() per evitare errori di visualizzazione sul terminale.
Inolter il valore di usleep() potrebbe non andate bene su altri sistemi magari più lenti.

Non ho cercato molto a dire il vero, sapete consigliarimi? Grazie.

Da http://linux.die.net/man/3/pclose


The pclose() function waits for the associated process to terminate and returns the exit status of the command as returned by wait4().

Teo@Unix
03-04-2010, 16:19
:doh: perbacco e si che mi leggo sempre le sintassi delle funzioni da lì :D

grazie, tutto ok!