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.