X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;ds=inline;f=ipc.tex;h=352a7197b9435ea9ff4217540c72efb3ef18dc47;hb=30a6a42996cb5bf0d7c0b2b607743893dc964cdd;hp=b8c703a773d7bb2524c5862c48daa1280215ef6d;hpb=21f7d0f48d68450dd105427b89df37b765616033;p=gapil.git diff --git a/ipc.tex b/ipc.tex index b8c703a..352a719 100644 --- a/ipc.tex +++ b/ipc.tex @@ -31,14 +31,15 @@ evoluto. \subsection{Le \textit{pipe} standard} \label{sec:ipc_pipes} -Le \textit{pipe} nascono sostanzialmente con Unix, e sono il primo, ed uno dei -più usati, meccanismi di comunicazione fra processi. Si tratta in sostanza uno -speciale tipo di file\footnote{più precisamente un file descriptor; le pipe - sono create dal kernel e non risiedono su disco.} in cui un processo scrive -ed un altro legge. Si viene così a costituire un canale di comunicazione fra i -due processi, nella forma di un \textsl{tubo} (da cui il nome) in cui uno dei -processi immette dati che poi arriveranno all'altro. - +Le \textit{pipe} nascono sostanzialmente con Unix, e sono il primo, e tuttora +uno dei più usati, meccanismi di comunicazione fra processi. Si tratta in +sostanza di uno speciale tipo di file descriptor, più precisamente una coppia +di file descriptor,\footnote{si tenga presente che le pipe sono oggetti creati + dal kernel e non risiedono su disco.} su cui da una parte si scrive e da +un'altra si legge. Si viene così a costituire un canale di comunicazione +tramite i due file descriptor, nella forma di un \textsl{tubo} (da cui il +nome) in cui in genere un processo immette dati che poi arriveranno ad un +altro. La funzione che permette di creare una pipe è appunto \func{pipe}; il suo prototipo è: @@ -94,16 +95,42 @@ Tutto ci comunicazione fra processi attraverso una pipe, utilizzando le ordinarie proprietà dei file, ma ci mostra anche qual'è il principale\footnote{Stevens riporta in APUE come limite anche il fatto che la comunicazione è - unidirezionale, in realtà questo è un limite facilemente risolvibile usando + unidirezionale, in realtà questo è un limite facilmente risolvibile usando una coppia di pipe.} limite nell'uso delle pipe. È necessario infatti che i processi possano condividere i file descriptor della pipe, e per questo essi devono comunque derivare da uno stesso processo padre che ha aperto la pipe, o, più comunemente, essere nella relazione padre/figlio. + + +\subsection{Un esempio dell'uso delle pipe} +\label{sec:ipc_pipe_use} + Per capire meglio il funzionamento di una pipe faremo un esempio di quello che è il loro uso più comune, analogo a quello effettuato della shell, e che -consiste nell'inviare l'output di un processo (usando lo standard output) -sull'input di un'altro. +consiste nell'inviare l'output di un processo (lo standard output) sull'input +di un'altro. Realizzaremo il programma nella forma di un +\textit{cgi-bin}\footnote{breve descrizione, da fare, di cosa è un cgi-bin.} +per apache, che genera una immagine JPEG di un codice a barre, specificato +come parametro di input. + +Per fare questo useremo i programmi \cmd{barcode} e \cmd{gs}, il primo infatti +è in grado di generare immagini postscript di codici a barre corrispondenti ad +una qualunque stringa, data come parametro, mentre il secondo è in grado di +convertire un file postscript in una immagine JPEG. Usando l'ouptut del primo +come input del secondo attraverso una pipe potremo generare immagini JPEG del +codice a barre di una stringa qualunque. + +Si potrebbe obiettare che sarebbe molto più semplice ottenere lo stesso +risultato salvando il tutto in un file temporaneo, ma si dovrebbe comunque +risolvere il problema di come comunicare il nome di questo file da un processo +all'altro, dato che utilizzare lo stesso file porterebbe ad inevitabili +sovrascritture nell'accavallarsi di diversi processi. L'uso di una pipe +permette di risolvere il problema in maniera semplice ed elegante. + +Il programma ci servirà anche come esempio dell'uso di alcune delle funzioni +di manipolazione dei file descriptor, come \func{dup} e \func{dup2}, viste in +\secref{sec:file_dup}