Usare pipe e fork

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


UsarePipeEFork

dal perl cookbook 16.10

Dovendo far parlare due processi, la primitiva piu’ semplice ed utile e’ la pipe. Pipe significa tubo ed in effetti e’ possibile fars un idea di due processi che sono attaccati tramite questo tubo, e dove uno parla l’altro ascolta.

potete trovare pipe() dentro il modulo IO:

lettore,scrittore = IO.pipe #crea un tubo, e restituisce "i due estremi"

ora, siccome lettore e scrittore sono due oggetti IO, possiamo leggerci e scriverci dentro. Ovviamente, pero’, dobbiamo avere due processi per poter comunicare :) Introduciamo fork() (notate che su windows non e’ implementata): fork() non fa altro che duplicare il programma. I due processi continueranno ad eseguire in parallelo il codice. Ma allora come fare a sapere che e’ il padre e chi il figlio?

Beh, si usa il valore di ritorno di fork(): nel padre sara’ il Process Id (pid) del figlio, mentre nel figlio sara’ soltanto nil. Quindi basta usare un if

if fork() 
   codice del processo padre
else 
   codice figlio
end

come al solito, possiamo anche usare un blocco: fork {codice figlio} codice padre

A questo punto, uno dei due scrivera’ nel tubo, e l’altro leggera’, ad esempio:

if fork 
  # non leggeremo, scriveremo:
  lettore.close 
  # ogni cosa che leggiamo da console viene scritto sul processo2
  scrittore.puts(gets) while true
else
  #non scriveremo, leggeremo
  lettore.close
  puts("messaggio dal processo padre:"+lettore.gets) while true
end

Ora, un ‘ultima cosa da considerare: padre e figlio condividono la stessa pipe. Se uno dei due scrive il messaggio potra’ essere letto da entrambi. Ma ovviamente questo non e’ quello che volete, quindi cercate di ricordare di chiudere l’oggetto lettore o scrittore in ognuno dei due processi. Un tubo funziona in una sola direzione.

Nota: per avere fork() su windows potete creare il modulo Win32::Process su rubyforge.

Created on November 25, 2005 13:43 by il gruppo (256.256.256.256)