c16d5c32ea8486a3d50d94697642579f590e5190
[gapil.git] / ipc.tex
1 \chapter{La comunicazione fra processi}
2 \label{cha:IPC}
3
4
5 Uno degli aspetti fondamentali della programmazione in un sistema unix-like è
6 la comunicazione fra processi. In questo capitolo affronteremo solo i
7 meccanismi più elementari che permettono di mettere in comunicazione processi
8 diversi, come quelli tradizionali che coinvolgono \textit{pipe} e
9 \textit{fifo} e i meccanismi di intercomunicazione di System V.
10
11 Tralasceremo invece tutte le problematiche relative alla comunicazione
12 attraverso la rete (e le relative interfacce) che saranno affrontate in
13 dettaglio in un secondo tempo.  Non affronteremo invece meccanismi più
14 complessi ed evoluti come le RPC (\textit{Remote Procedure Calls}) e CORBA
15 (\textit{Common Object Request Brocker Architecture}) che in genere sono
16 implementati con un ulteriore livello sopra i meccanismi elementari.
17
18
19
20 \section{La comunicazione fra processi tradizionale}
21 \label{sec:ipc_unix}
22
23 Il primo meccanismo di comunicazione fra processi usato dai sistemi unix-like,
24 e quello che viene correntemente usato di più, è quello delle \textit{pipe},
25 che sono una delle caratteristiche peculiari del sistema, in particolar modo
26 dell'interfaccia a linea di comando. In questa sezione descriveremo le sue
27 basi, le funzioni che ne gestiscono l'uso e le varie forme in cui si è
28 evoluto.
29
30
31 \subsection{Le \textit{pipe} standard}
32 \label{sec:ipc_pipes}
33
34 Le \textit{pipe} nascono sostanzialmente con Unix, e sono il primo, e tuttora
35 uno dei più usati, meccanismi di comunicazione fra processi. Si tratta in
36 sostanza di uno speciale tipo di file descriptor, più precisamente una coppia
37 di file descriptor,\footnote{si tenga presente che le pipe sono oggetti creati
38   dal kernel e non risiedono su disco.}  su cui da una parte si scrive e da
39 un'altra si legge. Si viene così a costituire un canale di comunicazione
40 tramite i due file descriptor, nella forma di un \textsl{tubo} (da cui il
41 nome) in cui in genere un processo immette dati che poi arriveranno ad un
42 altro.
43
44 La funzione che permette di creare una pipe è appunto \func{pipe}; il suo
45 prototipo è:
46 \begin{prototype}{unistd.h}
47 {int pipe(int filedes[2])} 
48   
49 Crea una coppia di file descriptor associati ad una pipe.
50   
51   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
52     errore, nel qual caso \var{errno} potrà assumere i valori \macro{EMFILE},
53     \macro{ENFILE} e \macro{EFAULT}.}
54 \end{prototype}
55
56 La funzione restituisce una coppia di file descriptor nell'array
57 \param{filedes}; il primo aperto in lettura ed il secondo in scrittura. Il
58 concetto di funzionamento di una pipe è relativamente semplice, quello che si
59 scrive nel file descriptor aperto in scrittura viene ripresentato tale e quale
60 nel file descriptor aperto in lettura, da cui può essere riletto.
61
62 I file descriptor infatti non sono connessi a nessun file reale, ma ad un
63 buffer nel kernel, la cui dimensione è specificata dalla costante
64 \macro{PIPE\_BUF}, (vedi \secref{sec:sys_file_limits}); lo schema di
65 funzionamento di una pipe è illustrato in \figref{fig:ipc_pipe_singular}, in
66 cui sono illustrati i due capi della pipe, associati a ciascun file
67 descriptor, con le frecce che indicano la direzione del flusso dei dati
68 attraverso la pipe.
69
70 \begin{figure}[htb]
71   \centering
72   \includegraphics[height=5cm]{img/pipe}
73   \caption{Schema della struttura di una pipe.}
74   \label{fig:ipc_pipe_singular}
75 \end{figure}
76
77 Chiaramente creare una pipe all'interno di un processo non serve a niente; se
78 però ricordiamo quanto esposto in \secref{sec:file_sharing} riguardo al
79 comportamento dei file descriptor nei processi figli, è immediato capire come
80 una pipe possa diventare un meccanismo di intercomunicazione. Un processo
81 figlio infatti condivide gli stessi file descriptor del padre, compresi quelli
82 associati ad una pipe (secondo la situazione illustrata in
83 \figref{fig:ipc_pipe_fork}). In questo modo se uno dei processi scrive su un
84 capo della pipe, l'altro può leggere.
85
86 \begin{figure}[htb]
87   \centering
88   \includegraphics[height=5cm]{img/pipefork}
89   \caption{Schema dei collegamenti ad una pipe, condivisi fra processo padre e
90     figlio dopo l'esecuzione \func{fork}.}
91   \label{fig:ipc_pipe_fork}
92 \end{figure}
93
94 Tutto ciò ci mostra come sia immediato realizzare un meccanismo di
95 comunicazione fra processi attraverso una pipe, utilizzando le ordinarie
96 proprietà dei file, ma ci mostra anche qual'è il principale\footnote{Stevens
97   in \cite{APUE} riporta come limite anche il fatto che la comunicazione è
98   unidirezionale, in realtà questo è un limite facilmente superabile usando
99   una coppia di pipe.} limite nell'uso delle pipe. È necessario infatti che i
100 processi possano condividere i file descriptor della pipe, e per questo essi
101 devono comunque derivare da uno stesso processo padre che ha aperto la pipe,
102 o, più comunemente, essere nella relazione padre/figlio.
103
104 A differenza di quanto avviene con i file normali la lettura da una pipe può
105 essere bloccante (qualora non siano presenti dati), inoltre se si legge da una
106 pipe il cui capo in scrittura è stato chiuso, si avrà la ricezione di un EOF
107 (vale a dire che la funzione \func{read} ritornerà restituendo 0).  Se invece
108 si esegue una scrittura su una pipe il cui capo in lettura non è aperto il
109 processo riceverà il segnale \macro{EPIPE}, e la funzione di scrittura
110 restituirà un errore di \macro{EPIPE} (al ritorno del manipolatore, o qualora
111 il segnale sia ignorato o bloccato).
112
113 La dimensione del buffer della pipe (\macro{PIPE\_BUF}) ci dà inoltre un'altra
114 importante informazione riguardo il comportamento delle operazioni di lettura
115 e scrittura su di una pipe; esse infatti sono atomiche fintanto che la
116 quantità di dati da scrivere non supera questa dimensione. Qualora ad esempio
117 si effettui una scrittura di una quantità di dati superiore l'operazione verrà
118 effettuata in più riprese, consentendo l'intromissione di scritture effettuate
119 da altri processi.
120
121
122 \subsection{Un esempio dell'uso delle pipe}
123 \label{sec:ipc_pipe_use}
124
125 Per capire meglio il funzionamento di una pipe faremo un esempio di quello che
126 è il loro uso più comune, analogo a quello effettuato della shell, e che
127 consiste nell'inviare l'output di un processo (lo standard output) sull'input
128 di un'altro. Realizzaremo il programma nella forma di un
129 \textit{CGI}\footnote{Un CGI (\textit{Common Gateway Interface}) è un programma
130   che permette la creazione dinamica di un oggetto da inserire all'interno di
131   una pagina HTML.}  per apache, che genera una immagine JPEG di un codice a
132 barre, specificato come parametro di input.
133
134 Un programma che deve essere eseguito come \textit{CGI} deve rispondere a
135 delle caratteristiche specifiche, esso infatti non viene lanciato da una
136 shell, ma dallo stesso web server, alla richiesta di una specifica URL, che di
137 solito ha la forma:
138 \begin{verbatim}
139     http://www.sito.it/cgi-bin/programma?parametro
140 \end{verbatim}
141 ed il risultato dell'elaborazione deve essere presentato (con una intestazione
142 che ne descrive il mime-type) sullo standard output, in modo che il web-server
143 possa reinviarlo al browser che ha effettuato la richiesta, che in questo modo
144 è in grado di visualizzarlo opportunamente.
145
146 Per fare questo useremo in sequenza i programmi \cmd{barcode} e \cmd{gs}, il
147 primo infatti è in grado di generare immagini postscript di codici a barre
148 corrispondenti ad una qualunque stringa, mentre il secondo serve per poter
149 effettuare la conversione della stessa immagine in formato JPEG. Usando una
150 pipe potremo inviare l'output del primo sull'input del secondo, secondo lo
151 schema mostrato in \figref{fig:ipc_pipe_use}, in cui la direzione del flusso
152 dei dati è data dalle frecce continue.
153
154 \begin{figure}[htb]
155   \centering
156   \includegraphics[height=5cm]{img/pipeuse}
157   \caption{Schema dell'uso di una pipe come mezzo di comunicazione fra
158     due processi attraverso attraverso l'esecuzione una \func{fork} e la
159     chiusura dei capi non utilizzati.}
160   \label{fig:ipc_pipe_use}
161 \end{figure}
162
163 Si potrebbe obiettare che sarebbe molto più semplice salvare il risultato
164 intermedio su un file temporaneo. Questo però non tiene conto del fatto che un
165 \textit{CGI} deve poter gestire più richieste in concorrenza, e si avrebbe una
166 evidente race condition in caso di accesso simultaneo a detto
167 file.\footnote{il problema potrebbe essere superato determinando in anticipo
168   un nome appropriato per il file temporaneo, che verrebbe utilizzato dai vari
169   sotto-processi, e cancellato alla fine della loro esecuzione; ma a questo le
170   cose non sarebbero più tanto semplici.}  L'uso di una pipe invece permette
171 di risolvere il problema in maniera semplice ed elegante.
172
173 Il programma ci servirà anche come esempio dell'uso delle funzioni di
174 duplicazione dei file descriptor che abbiamo trattato in
175 \secref{sec:file_dup}, in particolare di \func{dup2}. È attraverso queste
176 funzioni infatti che è possibile dirottare gli stream standard dei processi
177 (che abbiamo visto in \secref{sec:file_std_descr} e
178 \secref{sec:file_std_stream}) sulla pipe. In \figref{fig:ipc_barcodepage_code}
179 abbiamo riportato il corpo del programma, il cui codice completo è disponibile
180 nel file \file{BarCodePage.c} che si trova nella directory dei sorgenti.
181
182
183 \begin{figure}[!htb]
184   \footnotesize \centering
185   \begin{minipage}[c]{15cm}
186     \begin{lstlisting}{}
187 int main(int argc, char *argv[], char *envp[])
188 {
189     ...
190     /* create two pipes to handle process communication */
191     if ( (retval = pipe(pipein)) ) {
192         WriteMess("input pipe creation error");
193         exit(0);        
194     }
195     if ( (retval = pipe(pipeout)) ) {
196         WriteMess("output pipe creation error");
197         exit(0);        
198     }    
199     /* First fork: use child to run barcode program */
200     if ( (pid = fork()) == -1) {          /* on error exit */
201         WriteMess("child creation error");
202         exit(0);        
203     }
204     /* if child */
205     if (pid == 0) {
206         close(pipein[1]);                /* close pipe write end  */
207         dup2(pipein[0], STDIN_FILENO);   /* remap stdin to pipe read end */
208         close(pipeout[0]);
209         dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */
210         execlp("barcode", "barcode", size, NULL); //"-o", "-",  NULL);
211     } 
212     close(pipein[0]);                    /* close input side of input pipe */
213     write(pipein[1], argv[1], strlen(argv[1]));  /* write parameter to pipe */
214     close(pipein[1]);                    /* closing write end */
215     waitpid(pid, NULL, 0);               /* wait child completion */
216     /* Second fork: use child to run ghostscript */
217     if ( (pid = fork()) == -1) {          /* on error exit */
218         WriteMess("child creation error");
219         exit(0);
220     }
221     /* second child, convert PS to JPEG  */
222     if (pid == 0) {                     
223         close(pipeout[1]);              /* close write end */
224         dup2(pipeout[0], STDIN_FILENO); /* remap read end to stdin */
225         /* send mime type */
226         write(STDOUT_FILENO, content, strlen(content));
227         execlp("gs", "gs", "-q", "-sDEVICE=jpeg", "-sOutputFile=-", "-", NULL);
228     }
229     /* still parent */
230     close(pipeout[1]); 
231     waitpid(pid, NULL, 0);
232     exit(0);
233 }
234     \end{lstlisting}
235   \end{minipage} 
236   \normalsize 
237   \caption{Sezione principale del codice del \textit{CGI} 
238     \file{BarCodePage.c}.}
239   \label{fig:ipc_barcodepage_code}
240 \end{figure}
241
242 La prima operazione del programma (\texttt{\small 4--12}) è quella di creare
243 le due pipe che serviranno per la comunicazione fra i due comandi utilizzati
244 per produrre il codice a barre; si ha cura di controllare la riuscita della
245 chiamata, inviando in caso di errore un messaggio invece dell'immagine
246 richiesta.\footnote{la funzione \func{WriteMess}, non è riportata in
247   \secref{fig:ipc_barcodepage_code}; essa si incarica semplicemente di
248   formattare l'uscita alla maniera dei CGI, aggiungendo l'opportuno
249   \textit{mime type}, e formattando il messaggio in HTML, in modo che
250   quest'ultimo possa essere visualizzato correttamente da un browser.}
251
252 Una volta create le pipe, il programma può creare (\texttt{\small 13-17}) il
253 primo processo figlio, che si incaricherà (\texttt{\small 19--25}) di eseguire
254 \cmd{barcode}. Quest'ultimo legge dallo standard input una stringa di
255 caratteri, la converte nell'immagine postscript del codice a barre ad essa
256 corrispondente, e poi scrive il risultato direttamente sullo standard output.
257
258 Per poter utilizzare queste caratteristiche prima di eseguire \cmd{barcode} si
259 chiude (\texttt{\small 20}) il capo aperto in scrittura della prima pipe, e se
260 ne collega (\texttt{\small 21}) il capo in lettura allo standard input, usando
261 \func{dup2}. Si ricordi che invocando \func{dup2} il secondo file, qualora
262 risulti aperto, viene, come nel caso corrente, chiuso prima di effettuare la
263 duplicazione. Allo stesso modo, dato che \cmd{barcode} scrive l'immagine
264 postscript del codice a barre sullo standard output, per poter effettuare una
265 ulteriore redirezione il capo in lettura della seconda pipe viene chiuso
266 (\texttt{\small 22}) mentre il capo in scrittura viene collegato allo standard
267 output (\texttt{\small 23}).
268
269 In questo modo all'esecuzione (\texttt{\small 25}) di \cmd{barcode} (cui si
270 passa in \var{size} la dimensione della pagina per l'immagine) quest'ultimo
271 leggerà dalla prima pipe la stringa da codificare che gli sarà inviata dal
272 padre, e scriverà l'immagine postscript del codice a barre sulla seconda.
273
274 Al contempo una volta lanciato il primo figlio, il processo padre prima chiude
275 (\texttt{\small 26}) il capo inutilizzato della prima pipe (quello in input) e
276 poi scrive (\texttt{\small 27}) la stringa da convertire sul capo in output,
277 così che \cmd{barcode} possa riceverla dallo standard input. A questo punto
278 l'uso della prima pipe da parte del padre è finito ed essa può essere
279 definitivamente chiusa (\texttt{\small 28}), si attende poi (\texttt{\small
280   29}) che l'esecuzione di \cmd{barcode} sia completata.
281
282 Alla conclusione della sua esecuzione \cmd{barcode} avrà inviato l'immagine
283 postscript del codice a barre sul capo in scrittura della seconda pipe; a
284 questo punto si può eseguire la seconda conversione, da PS a JPEG, usando il
285 programma \cmd{gs}. Per questo si crea (\texttt{\small 30--34}) un secondo
286 processo figlio, che poi (\texttt{\small 35--42}) eseguirà questo programma
287 leggendo l'immagine postscript creata da \cmd{barcode} dallo standard input,
288 per convertirla in JPEG.
289
290 Per fare tutto ciò anzitutto si chiude (\texttt{\small 37}) il capo in
291 scrittura della seconda pipe, e se ne collega (\texttt{\small 38}) il capo in
292 lettura allo standard input. Per poter formattare l'output del programma in
293 maniera utilizzabile da un browser, si provvede anche \texttt{\small 40}) alla
294 scrittura dell'apposita stringa di identificazione del mime-type in testa allo
295 standard output. A questo punto si può invocare \texttt{\small 41}) \cmd{gs},
296 provvedendo gli appositi switch che consentono di leggere il file da
297 convertire dallo standard input e di inviare la conversione sullo standard
298 output.
299
300 Per completare le operazioni il processo padre chiude (\texttt{\small 44}) il
301 capo in scrittura della seconda pipe, e attende la conclusione del figlio
302 (\texttt{\small 45}); a questo punto può (\texttt{\small 46}) uscire. Si tenga
303 conto che l'operazione di chiudere il capo in scrittura della seconda pipe è
304 necessaria, infatti, se non venisse chiusa, \cmd{gs}, che legge il suo
305 standard input da detta pipe, resterebbe bloccato in attesa di ulteriori dati
306 in ingresso (l'unico modo che un programma ha per sapere che l'input è
307 terminato è rilevare che lo standard input è stato chiuso), e la \func{wait}
308 non ritornerebbe.
309
310
311 \subsection{Le funzioni \func{popen} e \func{pclose}}
312 \label{sec:ipc_popen}
313
314 Come si è visto la modalità più comune di utilizzo di una pipe è quella di
315 utilizzarla per fare da tramite fra output ed input di due programmi invocati
316 in sequenza; per questo motivo lo standard POSIX.2 ha introdotto due funzioni
317 che permettono di sintetizzare queste operazioni. La prima di esse si chiama
318 \func{popen} ed il suo prototipo è:
319 \begin{prototype}{stdio.h}
320 {FILE *popen(const char *command, const char *type)}
321
322 Esegue il programma \param{command}, di cui, a seconda di \param{type},
323 restituisce, lo standard input o lo standard output nella pipe collegata allo
324 stream restituito come valore di ritorno.
325   
326 \bodydesc{La funzione restituisce l'indirizzo dello stream associato alla pipe
327   in caso di successo e \macro{NULL} per un errore, nel qual caso \var{errno}
328   potrà assumere i valori relativi alle sottostanti invocazioni di \func{pipe}
329   e \func{fork} o \macro{EINVAL} se \param{type} non è valido.}
330 \end{prototype}
331
332 La funzione crea una pipe, esegue una \func{fork}, ed invoca il programma
333 \param{command} attraverso la shell (in sostanza esegue \file{/bin/sh} con il
334 flag \code{-c}); l'argomento \param{type} deve essere una delle due stringhe
335 \verb|"w"| o \verb|"r"|, per indicare se la pipe sarà collegata allo standard
336 input o allo standard output del comando invocato.
337
338 La funzione restituisce il puntatore allo stream associato alla pipe creata,
339 che sarà aperto in sola lettura (e quindi associato allo standard output del
340 programma indicato) in caso si sia indicato \code{"r"}, o in sola scrittura (e
341 quindi associato allo standard input) in caso di \code{"w"}.
342
343 Lo stream restituito da \func{popen} è identico a tutti gli effetti ai file
344 stream visti in \secref{cha:files_std_interface}, anche se è collegato ad una
345 pipe e non ad un inode, e viene sempre aperto in modalità
346 \textit{fully-buffered} (vedi \secref{sec:file_buffering}); l'unica differenza
347 con gli usuali stream è che dovrà essere chiuso dalla seconda delle due nuove
348 funzioni, \func{pclose}, il cui prototipo è:
349 \begin{prototype}{stdio.h}
350 {int pclose(FILE *stream)}
351
352 Chiude il file \param{stream}, restituito da una precedente \func{popen}
353 attendendo la terminazione del processo ad essa associato.
354   
355 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
356   errore; nel quel caso il valore di \func{errno} deriva dalle sottostanti
357   chiamate.}
358 \end{prototype}
359 \noindent che oltre alla chiusura dello stream si incarica anche di attendere
360 (tramite \func{wait4}) la conclusione del processo creato dalla precedente
361 \func{popen}.
362
363 Per illustrare l'uso di queste due funzioni riprendiamo il problema
364 precedente: il programma mostrato in \figref{fig:ipc_barcodepage_code} per
365 quanto funzionante, è (volutamente) codificato in maniera piuttosto complessa,
366 inoltre nella pratica sconta un problema di \cmd{gs} che non è in
367 grado\footnote{nella versione GNU Ghostscript 6.53 (2002-02-13).} di
368 riconoscere correttamente l'encapsulated postscript, per cui deve essere usato
369 il postscript e tutte le volte viene generata una pagina intera, invece che
370 una immagine delle dimensioni corrispondenti al codice a barre.
371
372 Se si vuole generare una immagine di dimensioni appropriate si deve usare un
373 approccio diverso. Una possibilità sarebbe quella di ricorrere ad ulteriore
374 programma, \cmd{epstopsf}, per convertire in PDF un file EPS (che può essere
375 generato da \cmd{barcode} utilizzando lo switch \cmd{-E}).  Utilizzando un PDF
376 al posto di un EPS \cmd{gs} esegue la conversione rispettando le dimensioni
377 originarie del codice a barre e produce un JPEG delle dimensioni adeguate.
378
379 Questo però ci porta a scontrarci con una caratteristica peculiare delle pipe,
380 che a prima vista non è evidente. Per poter effettuare la conversione di un
381 PDF infatti è necessario, per la struttura del formato, dover eseguire delle
382 \func{lseek} sul file da convertire; se si esegue \cmd{gs} su un file normale
383 non ci sono problemi, ma una pipe però è rigidamente sequenziale, ed il
384 tentativo di eseguire detta operazione su una pipe comporta l'immediato
385 fallimento con un errore di \macro{ESPIPE}.  Questo ci dice che in generale la
386 concatenazione di vari programmi funzionerà soltanto quando tutti prevedono
387 una lettura sequenziale del loro input.
388
389 Per questo motivo si è dovuto utilizzare una strada diversa, che prevede la
390 conversione attraverso \cmd{gs} del PS in un altro formato intermedio, il
391 PPM,\footnote{il \textit{Portable PixMap file format} è un formato usato
392   spesso come formato intermedio per effettuare conversioni, è estremamente
393   inefficiente, ma molto facile da manipolare dato che usa caratteri ASCII per
394   memorizzare le immagini.} dal quale poi si può ottenere un'immagine di
395 dimensioni corrette attraverso vari programmi di manipolazione (\cmd{pnmcrop},
396 \cmd{pnmmargin}) che può essere infine trasformata in PNG (con \cmd{pnm2png}).
397
398 In questo caso però occorre eseguire in sequenza ben quattro comandi diversi,
399 inviando l'output di ciascuno all'input del successivo, per poi ottenere il
400 risultato finale sullo standard output: un caso classico di utilizzazione
401 delle pipe, in cui l'uso di \func{popen} e \func{pclose} permette di
402 semplificare notevolmente la stesura del codice.
403
404 Nel nostro caso, dato che ciascun processo deve scrivere il suo output sullo
405 standard input del successivo, occorrerà usare \func{popen} aprendo la pipe in
406 scrittura. Il codice del nuovo programma è riportato in
407 \figref{fig:ipc_barcode_code}.  Come si può notare l'ordine di invocazione dei
408 programmi è l'inverso di quello in cui ci si aspetta che vengano
409 effettivamente eseguiti. Questo non comporta nessun problema dato che la
410 lettura su una pipe è bloccante, per cui ciascun processo, per quanto lanciato
411 per primo, si bloccherà in attesa di ricevere sullo standard input il
412 risultato dell'elaborazione del precedente, benchè quest'ultimo venga
413 invocato dopo.
414
415 \begin{figure}[!htb]
416   \footnotesize \centering
417   \begin{minipage}[c]{15cm}
418     \begin{lstlisting}{}
419 int main(int argc, char *argv[], char *envp[])
420 {
421     FILE *pipe[4];
422     FILE *pipein;
423     char *cmd_string[4]={
424         "pnmtopng",
425         "pnmmargin -white 10",
426         "pnmcrop",
427         "gs -sDEVICE=ppmraw -sOutputFile=- -sNOPAUSE -q - -c showpage -c quit"
428     };  
429     char content[]="Content-type: image/png\n\n";
430     int i;
431     /* write mime-type to stout */ 
432     write(STDOUT_FILENO, content, strlen(content));
433     /* execute chain of command */
434     for (i=0; i<4; i++) {
435         pipe[i] = popen(cmd_string[i], "w");
436         dup2(fileno(pipe[i]), STDOUT_FILENO); 
437     }
438     /* create barcode (in PS) */
439     pipein = popen("barcode", "w");
440     /* send barcode string to barcode program */
441     write(fileno(pipein), argv[1], strlen(argv[1]));
442     /* close all pipes (in reverse order) */
443     for (i=4; i==0; i--) {
444         pclose((pipe[i]));
445     }
446     exit(0);
447 }
448     \end{lstlisting}
449   \end{minipage} 
450   \normalsize 
451   \caption{Codice completo del \textit{CGI} \file{BarCode.c}.}
452   \label{fig:ipc_barcode_code}
453 \end{figure}
454
455 Nel nostro caso il primo passo (\texttt{\small 14}) è scrivere il mime-type
456 sullo standard output; a questo punto il processo padre non necessita più di
457 eseguire ulteriori operazioni sullo standard output e può tranquillamente
458 provvedere alla redirezione.
459
460 Dato che i vari programmi devono essere lanciati in successione, si è
461 approntato un ciclo (\texttt{\small 15--19}) che esegue le operazioni in
462 sequenza: prima crea una pipe (\texttt{\small 17}) per la scrittura eseguendo
463 il programma con \func{popen}, in modo che essa sia collegata allo standard
464 input, e poi redirige (\texttt{\small 18}) lo standard output su detta pipe.
465
466 In questo modo il primo processo ad essere invocato (che è l'ultimo della
467 catena) scriverà ancora sullo standard output del processo padre, ma i
468 successivi, a causa di questa redirezione, scriveranno sulla pipe associata
469 allo standard input del processo invocato nel ciclo precedente.
470
471 Alla fine tutto quello che resta da fare è lanciare (\texttt{\small 21}) il
472 primo processo della catena, che nel caso è \cmd{barcode}, e scrivere
473 (\texttt{\small 23}) la stringa del codice a barre sulla pipe, che è collegata
474 al suo standard input, infine si può eseguire (\texttt{\small 24--27}) un
475 ciclo, che chiuda, nell'ordine inverso rispetto a quello in cui le si sono
476 create, tutte le pipe create con \func{pclose}.
477
478
479 \subsection{Le \textit{pipe} con nome, o \textit{fifo}}
480 \label{sec:ipc_named_pipe}
481
482 Come accennato in \secref{sec:ipc_pipes} il problema delle \textit{pipe} è che
483 esse possono essere utilizzate solo da processi con un progenitore comune o
484 nella relazione padre/figlio; per superare questo problema lo standard POSIX.1
485 ha definito dei nuovi oggetti, le \textit{fifo}, che hanno le stesse
486 caratteristiche delle pipe, ma che invece di essere strutture interne del
487 kernel, visibili solo attraverso un file descriptor, sono accessibili
488 attraverso un inode che risiede sul filesystem, così che i processi le possono
489 usare senza dovere per forza essere in una relazione di \textsl{parentela}.
490
491 Utilizzando una \textit{fifo} tutti i dati passeranno, come per le pipe,
492 attraverso un apposito buffer nel kernel, senza transitare dal filesystem;
493 l'inode allocato sul filesystem serve infatti solo a fornire un punto di
494 riferimento per i processi, che permetta loro di accedere alla stessa fifo; il
495 comportamento delle funzioni di lettura e scrittura è identico a quello
496 illustrato per le pipe in \secref{sec:ipc_pipes}.
497
498 Abbiamo già visto in \secref{sec:file_mknod} le funzioni \func{mknod} e
499 \func{mkfifo} che permettono di creare una fifo; per utilizzarne una un
500 processo non avrà che da aprire il relativo file speciale o in lettura o
501 scrittura; nel primo caso sarà collegato al capo di uscita della fifo, e dovrà
502 leggere, nel secondo al capo di ingresso, e dovrà scrivere.
503
504 Il kernel crea una singola pipe per ciascuna fifo che sia stata aperta, che può
505 essere acceduta contemporaneamente da più processi, sia in lettura che in
506 scrittura. Dato che per funzionare deve essere aperta in entrambe le
507 direzioni, per una fifo di norma la funzione \func{open} si blocca se viene
508 eseguita quando l'altro capo non è aperto.
509
510 Le fifo però possono essere anche aperte in modalità \textsl{non-bloccante},
511 nel qual caso l'apertura del capo in lettura avrà successo solo quando anche
512 l'altro capo è aperto, mentre l'apertura del capo in scrittura restituirà
513 l'errore di \macro{ENXIO} fintanto che non verrà aperto il capo in lettura.
514
515 In Linux\footnote{lo standard POSIX lascia indefinito questo comportamento.} è
516 possibile aprire le fifo anche in lettura/scrittura, operazione che avrà
517 sempre successo immediato qualunque sia la modalità di apertura (bloccante e
518 non bloccante); questo può essere utilizzato per aprire comunque una fifo in
519 scrittura anche se non ci sono ancora processi il lettura; è possibile anche
520 usare la fifo all'interno di un solo processo, nel qual caso però occorre
521 stare molto attenti alla possibili deadlock.\footnote{se si cerca di leggere
522   da una fifo che non contiene dati si avrà un deadlock immediato, dato che il
523   processo si blocca e non potrà quindi mai eseguire le funzioni di
524   scrittura.}
525
526 L'impiego più comune per le fifo è quello che le vede impegnate con un
527 processo in 
528
529
530 \section{La comunicazione fra processi di System V}
531 \label{sec:ipc_sysv}
532
533 Benché le pipe (e le fifo) siano ancora ampiamente usate, esse presentano
534 numerosi limiti, il principale dei quali è che il meccanismo di comunicazione
535 è rigidamente sequenziale; una situazione in cui un processo scrive qualcosa
536 che molti altri devono poter leggere non può essere implementata con una pipe.
537
538 Per superarne i vari limiti, nello sviluppo di System V vennero introdotti una
539 serie di nuovi oggetti di comunicazione e relative interfacce id
540 programmazione che garantissero una maggiore flessibilità; in questa sezione
541 esamineremo quello che viene ormai chiamato il \textsl{Sistema di
542   comunicazione inter-processo} di System V , più comunemente noto come
543 \textit{System V IPC (Inter-Process Comunication)}.
544  
545
546 \subsection{Code di messaggi}
547 \label{sec:ipc_messque}
548
549 Il primo oggetto introdotto dal \textit{System V IPC} è quello delle code di
550 messaggi.
551
552 \subsection{Semafori}
553 \label{sec:ipc_semaph}
554
555 Il secondo oggetto introdotto dal \textit{System V IPC} è quello dei semafori.
556
557
558 \subsection{Memoria condivisa}
559 \label{sec:ipc_shar_mem}
560
561 Il terzo oggetto introdotto dal \textit{System V IPC} è quello della memoria
562 condivisa.
563
564 %%% Local Variables: 
565 %%% mode: latex
566 %%% TeX-master: "gapil"
567 %%% End: