Aggiunte varie sempre sui segnali real-time
[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 e quelli POSIX.
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. Realizzeremo 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, oltre ad essere
172 molto più efficiente, dato che non si deve scrivere su disco.
173
174 Il programma ci servirà anche come esempio dell'uso delle funzioni di
175 duplicazione dei file descriptor che abbiamo trattato in
176 \secref{sec:file_dup}, in particolare di \func{dup2}. È attraverso queste
177 funzioni infatti che è possibile dirottare gli stream standard dei processi
178 (che abbiamo visto in \secref{sec:file_std_descr} e
179 \secref{sec:file_std_stream}) sulla pipe. In \figref{fig:ipc_barcodepage_code}
180 abbiamo riportato il corpo del programma, il cui codice completo è disponibile
181 nel file \file{BarCodePage.c} che si trova nella directory dei sorgenti.
182
183
184 \begin{figure}[!htb]
185   \footnotesize \centering
186   \begin{minipage}[c]{15cm}
187     \begin{lstlisting}{}
188 int main(int argc, char *argv[], char *envp[])
189 {
190     ...
191     /* create two pipes to handle process communication */
192     if ( (retval = pipe(pipein)) ) {
193         WriteMess("input pipe creation error");
194         exit(0);        
195     }
196     if ( (retval = pipe(pipeout)) ) {
197         WriteMess("output pipe creation error");
198         exit(0);        
199     }    
200     /* First fork: use child to run barcode program */
201     if ( (pid = fork()) == -1) {          /* on error exit */
202         WriteMess("child creation error");
203         exit(0);        
204     }
205     /* if child */
206     if (pid == 0) {
207         close(pipein[1]);                /* close pipe write end  */
208         dup2(pipein[0], STDIN_FILENO);   /* remap stdin to pipe read end */
209         close(pipeout[0]);
210         dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */
211         execlp("barcode", "barcode", size, NULL); //"-o", "-",  NULL);
212     } 
213     close(pipein[0]);                    /* close input side of input pipe */
214     write(pipein[1], argv[1], strlen(argv[1]));  /* write parameter to pipe */
215     close(pipein[1]);                    /* closing write end */
216     waitpid(pid, NULL, 0);               /* wait child completion */
217     /* Second fork: use child to run ghostscript */
218     if ( (pid = fork()) == -1) {          /* on error exit */
219         WriteMess("child creation error");
220         exit(0);
221     }
222     /* second child, convert PS to JPEG  */
223     if (pid == 0) {                     
224         close(pipeout[1]);              /* close write end */
225         dup2(pipeout[0], STDIN_FILENO); /* remap read end to stdin */
226         /* send mime type */
227         write(STDOUT_FILENO, content, strlen(content));
228         execlp("gs", "gs", "-q", "-sDEVICE=jpeg", "-sOutputFile=-", "-", NULL);
229     }
230     /* still parent */
231     close(pipeout[1]); 
232     waitpid(pid, NULL, 0);
233     exit(0);
234 }
235     \end{lstlisting}
236   \end{minipage} 
237   \normalsize 
238   \caption{Sezione principale del codice del \textit{CGI} 
239     \file{BarCodePage.c}.}
240   \label{fig:ipc_barcodepage_code}
241 \end{figure}
242
243 La prima operazione del programma (\texttt{\small 4--12}) è quella di creare
244 le due pipe che serviranno per la comunicazione fra i due comandi utilizzati
245 per produrre il codice a barre; si ha cura di controllare la riuscita della
246 chiamata, inviando in caso di errore un messaggio invece dell'immagine
247 richiesta.\footnote{la funzione \func{WriteMess}, non è riportata in
248   \secref{fig:ipc_barcodepage_code}; essa si incarica semplicemente di
249   formattare l'uscita alla maniera dei CGI, aggiungendo l'opportuno
250   \textit{mime type}, e formattando il messaggio in HTML, in modo che
251   quest'ultimo possa essere visualizzato correttamente da un browser.}
252
253 Una volta create le pipe, il programma può creare (\texttt{\small 13-17}) il
254 primo processo figlio, che si incaricherà (\texttt{\small 19--25}) di eseguire
255 \cmd{barcode}. Quest'ultimo legge dallo standard input una stringa di
256 caratteri, la converte nell'immagine postscript del codice a barre ad essa
257 corrispondente, e poi scrive il risultato direttamente sullo standard output.
258
259 Per poter utilizzare queste caratteristiche prima di eseguire \cmd{barcode} si
260 chiude (\texttt{\small 20}) il capo aperto in scrittura della prima pipe, e se
261 ne collega (\texttt{\small 21}) il capo in lettura allo standard input, usando
262 \func{dup2}. Si ricordi che invocando \func{dup2} il secondo file, qualora
263 risulti aperto, viene, come nel caso corrente, chiuso prima di effettuare la
264 duplicazione. Allo stesso modo, dato che \cmd{barcode} scrive l'immagine
265 postscript del codice a barre sullo standard output, per poter effettuare una
266 ulteriore redirezione il capo in lettura della seconda pipe viene chiuso
267 (\texttt{\small 22}) mentre il capo in scrittura viene collegato allo standard
268 output (\texttt{\small 23}).
269
270 In questo modo all'esecuzione (\texttt{\small 25}) di \cmd{barcode} (cui si
271 passa in \var{size} la dimensione della pagina per l'immagine) quest'ultimo
272 leggerà dalla prima pipe la stringa da codificare che gli sarà inviata dal
273 padre, e scriverà l'immagine postscript del codice a barre sulla seconda.
274
275 Al contempo una volta lanciato il primo figlio, il processo padre prima chiude
276 (\texttt{\small 26}) il capo inutilizzato della prima pipe (quello in input) e
277 poi scrive (\texttt{\small 27}) la stringa da convertire sul capo in output,
278 così che \cmd{barcode} possa riceverla dallo standard input. A questo punto
279 l'uso della prima pipe da parte del padre è finito ed essa può essere
280 definitivamente chiusa (\texttt{\small 28}), si attende poi (\texttt{\small
281   29}) che l'esecuzione di \cmd{barcode} sia completata.
282
283 Alla conclusione della sua esecuzione \cmd{barcode} avrà inviato l'immagine
284 postscript del codice a barre sul capo in scrittura della seconda pipe; a
285 questo punto si può eseguire la seconda conversione, da PS a JPEG, usando il
286 programma \cmd{gs}. Per questo si crea (\texttt{\small 30--34}) un secondo
287 processo figlio, che poi (\texttt{\small 35--42}) eseguirà questo programma
288 leggendo l'immagine postscript creata da \cmd{barcode} dallo standard input,
289 per convertirla in JPEG.
290
291 Per fare tutto ciò anzitutto si chiude (\texttt{\small 37}) il capo in
292 scrittura della seconda pipe, e se ne collega (\texttt{\small 38}) il capo in
293 lettura allo standard input. Per poter formattare l'output del programma in
294 maniera utilizzabile da un browser, si provvede anche \texttt{\small 40}) alla
295 scrittura dell'apposita stringa di identificazione del mime-type in testa allo
296 standard output. A questo punto si può invocare \texttt{\small 41}) \cmd{gs},
297 provvedendo gli appositi switch che consentono di leggere il file da
298 convertire dallo standard input e di inviare la conversione sullo standard
299 output.
300
301 Per completare le operazioni il processo padre chiude (\texttt{\small 44}) il
302 capo in scrittura della seconda pipe, e attende la conclusione del figlio
303 (\texttt{\small 45}); a questo punto può (\texttt{\small 46}) uscire. Si tenga
304 conto che l'operazione di chiudere il capo in scrittura della seconda pipe è
305 necessaria, infatti, se non venisse chiusa, \cmd{gs}, che legge il suo
306 standard input da detta pipe, resterebbe bloccato in attesa di ulteriori dati
307 in ingresso (l'unico modo che un programma ha per sapere che l'input è
308 terminato è rilevare che lo standard input è stato chiuso), e la \func{wait}
309 non ritornerebbe.
310
311
312 \subsection{Le funzioni \func{popen} e \func{pclose}}
313 \label{sec:ipc_popen}
314
315 Come si è visto la modalità più comune di utilizzo di una pipe è quella di
316 utilizzarla per fare da tramite fra output ed input di due programmi invocati
317 in sequenza; per questo motivo lo standard POSIX.2 ha introdotto due funzioni
318 che permettono di sintetizzare queste operazioni. La prima di esse si chiama
319 \func{popen} ed il suo prototipo è:
320 \begin{prototype}{stdio.h}
321 {FILE *popen(const char *command, const char *type)}
322
323 Esegue il programma \param{command}, di cui, a seconda di \param{type},
324 restituisce, lo standard input o lo standard output nella pipe collegata allo
325 stream restituito come valore di ritorno.
326   
327 \bodydesc{La funzione restituisce l'indirizzo dello stream associato alla pipe
328   in caso di successo e \macro{NULL} per un errore, nel qual caso \var{errno}
329   potrà assumere i valori relativi alle sottostanti invocazioni di \func{pipe}
330   e \func{fork} o \macro{EINVAL} se \param{type} non è valido.}
331 \end{prototype}
332
333 La funzione crea una pipe, esegue una \func{fork}, ed invoca il programma
334 \param{command} attraverso la shell (in sostanza esegue \file{/bin/sh} con il
335 flag \code{-c}); l'argomento \param{type} deve essere una delle due stringhe
336 \verb|"w"| o \verb|"r"|, per indicare se la pipe sarà collegata allo standard
337 input o allo standard output del comando invocato.
338
339 La funzione restituisce il puntatore allo stream associato alla pipe creata,
340 che sarà aperto in sola lettura (e quindi associato allo standard output del
341 programma indicato) in caso si sia indicato \code{"r"}, o in sola scrittura (e
342 quindi associato allo standard input) in caso di \code{"w"}.
343
344 Lo stream restituito da \func{popen} è identico a tutti gli effetti ai file
345 stream visti in \secref{cha:files_std_interface}, anche se è collegato ad una
346 pipe e non ad un inode, e viene sempre aperto in modalità
347 \textit{fully-buffered} (vedi \secref{sec:file_buffering}); l'unica differenza
348 con gli usuali stream è che dovrà essere chiuso dalla seconda delle due nuove
349 funzioni, \func{pclose}, il cui prototipo è:
350 \begin{prototype}{stdio.h}
351 {int pclose(FILE *stream)}
352
353 Chiude il file \param{stream}, restituito da una precedente \func{popen}
354 attendendo la terminazione del processo ad essa associato.
355   
356 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
357   errore; nel quel caso il valore di \func{errno} deriva dalle sottostanti
358   chiamate.}
359 \end{prototype}
360 \noindent che oltre alla chiusura dello stream si incarica anche di attendere
361 (tramite \func{wait4}) la conclusione del processo creato dalla precedente
362 \func{popen}.
363
364 Per illustrare l'uso di queste due funzioni riprendiamo il problema
365 precedente: il programma mostrato in \figref{fig:ipc_barcodepage_code} per
366 quanto funzionante, è (volutamente) codificato in maniera piuttosto complessa,
367 inoltre nella pratica sconta un problema di \cmd{gs} che non è in
368 grado\footnote{nella versione GNU Ghostscript 6.53 (2002-02-13).} di
369 riconoscere correttamente l'encapsulated postscript, per cui deve essere usato
370 il postscript e tutte le volte viene generata una pagina intera, invece che
371 una immagine delle dimensioni corrispondenti al codice a barre.
372
373 Se si vuole generare una immagine di dimensioni appropriate si deve usare un
374 approccio diverso. Una possibilità sarebbe quella di ricorrere ad ulteriore
375 programma, \cmd{epstopsf}, per convertire in PDF un file EPS (che può essere
376 generato da \cmd{barcode} utilizzando lo switch \cmd{-E}).  Utilizzando un PDF
377 al posto di un EPS \cmd{gs} esegue la conversione rispettando le dimensioni
378 originarie del codice a barre e produce un JPEG delle dimensioni adeguate.
379
380 Questo però ci porta a scontrarci con una caratteristica peculiare delle pipe,
381 che a prima vista non è evidente. Per poter effettuare la conversione di un
382 PDF infatti è necessario, per la struttura del formato, dover eseguire delle
383 \func{lseek} sul file da convertire; se si esegue \cmd{gs} su un file normale
384 non ci sono problemi, ma una pipe però è rigidamente sequenziale, ed il
385 tentativo di eseguire detta operazione su una pipe comporta l'immediato
386 fallimento con un errore di \macro{ESPIPE}.  Questo ci dice che in generale la
387 concatenazione di vari programmi funzionerà soltanto quando tutti prevedono
388 una lettura sequenziale del loro input.
389
390 Per questo motivo si è dovuto utilizzare una strada diversa, che prevede la
391 conversione attraverso \cmd{gs} del PS in un altro formato intermedio, il
392 PPM,\footnote{il \textit{Portable PixMap file format} è un formato usato
393   spesso come formato intermedio per effettuare conversioni, è estremamente
394   inefficiente, ma molto facile da manipolare dato che usa caratteri ASCII per
395   memorizzare le immagini.} dal quale poi si può ottenere un'immagine di
396 dimensioni corrette attraverso vari programmi di manipolazione (\cmd{pnmcrop},
397 \cmd{pnmmargin}) che può essere infine trasformata in PNG (con \cmd{pnm2png}).
398
399 In questo caso però occorre eseguire in sequenza ben quattro comandi diversi,
400 inviando l'output di ciascuno all'input del successivo, per poi ottenere il
401 risultato finale sullo standard output: un caso classico di utilizzazione
402 delle pipe, in cui l'uso di \func{popen} e \func{pclose} permette di
403 semplificare notevolmente la stesura del codice.
404
405 Nel nostro caso, dato che ciascun processo deve scrivere il suo output sullo
406 standard input del successivo, occorrerà usare \func{popen} aprendo la pipe in
407 scrittura. Il codice del nuovo programma è riportato in
408 \figref{fig:ipc_barcode_code}.  Come si può notare l'ordine di invocazione dei
409 programmi è l'inverso di quello in cui ci si aspetta che vengano
410 effettivamente eseguiti. Questo non comporta nessun problema dato che la
411 lettura su una pipe è bloccante, per cui ciascun processo, per quanto lanciato
412 per primo, si bloccherà in attesa di ricevere sullo standard input il
413 risultato dell'elaborazione del precedente, benchè quest'ultimo venga
414 invocato dopo.
415
416 \begin{figure}[!htb]
417   \footnotesize \centering
418   \begin{minipage}[c]{15cm}
419     \begin{lstlisting}{}
420 int main(int argc, char *argv[], char *envp[])
421 {
422     FILE *pipe[4];
423     FILE *pipein;
424     char *cmd_string[4]={
425         "pnmtopng",
426         "pnmmargin -white 10",
427         "pnmcrop",
428         "gs -sDEVICE=ppmraw -sOutputFile=- -sNOPAUSE -q - -c showpage -c quit"
429     };  
430     char content[]="Content-type: image/png\n\n";
431     int i;
432     /* write mime-type to stout */ 
433     write(STDOUT_FILENO, content, strlen(content));
434     /* execute chain of command */
435     for (i=0; i<4; i++) {
436         pipe[i] = popen(cmd_string[i], "w");
437         dup2(fileno(pipe[i]), STDOUT_FILENO); 
438     }
439     /* create barcode (in PS) */
440     pipein = popen("barcode", "w");
441     /* send barcode string to barcode program */
442     write(fileno(pipein), argv[1], strlen(argv[1]));
443     /* close all pipes (in reverse order) */
444     for (i=4; i==0; i--) {
445         pclose((pipe[i]));
446     }
447     exit(0);
448 }
449     \end{lstlisting}
450   \end{minipage} 
451   \normalsize 
452   \caption{Codice completo del \textit{CGI} \file{BarCode.c}.}
453   \label{fig:ipc_barcode_code}
454 \end{figure}
455
456 Nel nostro caso il primo passo (\texttt{\small 14}) è scrivere il mime-type
457 sullo standard output; a questo punto il processo padre non necessita più di
458 eseguire ulteriori operazioni sullo standard output e può tranquillamente
459 provvedere alla redirezione.
460
461 Dato che i vari programmi devono essere lanciati in successione, si è
462 approntato un ciclo (\texttt{\small 15--19}) che esegue le operazioni in
463 sequenza: prima crea una pipe (\texttt{\small 17}) per la scrittura eseguendo
464 il programma con \func{popen}, in modo che essa sia collegata allo standard
465 input, e poi redirige (\texttt{\small 18}) lo standard output su detta pipe.
466
467 In questo modo il primo processo ad essere invocato (che è l'ultimo della
468 catena) scriverà ancora sullo standard output del processo padre, ma i
469 successivi, a causa di questa redirezione, scriveranno sulla pipe associata
470 allo standard input del processo invocato nel ciclo precedente.
471
472 Alla fine tutto quello che resta da fare è lanciare (\texttt{\small 21}) il
473 primo processo della catena, che nel caso è \cmd{barcode}, e scrivere
474 (\texttt{\small 23}) la stringa del codice a barre sulla pipe, che è collegata
475 al suo standard input, infine si può eseguire (\texttt{\small 24--27}) un
476 ciclo, che chiuda, nell'ordine inverso rispetto a quello in cui le si sono
477 create, tutte le pipe create con \func{pclose}.
478
479
480 \subsection{Le \textit{pipe} con nome, o \textit{fifo}}
481 \label{sec:ipc_named_pipe}
482
483 Come accennato in \secref{sec:ipc_pipes} il problema delle \textit{pipe} è che
484 esse possono essere utilizzate solo da processi con un progenitore comune o
485 nella relazione padre/figlio; per superare questo problema lo standard POSIX.1
486 ha definito dei nuovi oggetti, le \textit{fifo}, che hanno le stesse
487 caratteristiche delle pipe, ma che invece di essere strutture interne del
488 kernel, visibili solo attraverso un file descriptor, sono accessibili
489 attraverso un inode che risiede sul filesystem, così che i processi le possono
490 usare senza dovere per forza essere in una relazione di \textsl{parentela}.
491
492 Utilizzando una \textit{fifo} tutti i dati passeranno, come per le pipe,
493 attraverso un apposito buffer nel kernel, senza transitare dal filesystem;
494 l'inode allocato sul filesystem serve infatti solo a fornire un punto di
495 riferimento per i processi, che permetta loro di accedere alla stessa fifo; il
496 comportamento delle funzioni di lettura e scrittura è identico a quello
497 illustrato per le pipe in \secref{sec:ipc_pipes}.
498
499 Abbiamo già visto in \secref{sec:file_mknod} le funzioni \func{mknod} e
500 \func{mkfifo} che permettono di creare una fifo; per utilizzarne una un
501 processo non avrà che da aprire il relativo file speciale o in lettura o
502 scrittura; nel primo caso sarà collegato al capo di uscita della fifo, e dovrà
503 leggere, nel secondo al capo di ingresso, e dovrà scrivere.
504
505 Il kernel crea una singola pipe per ciascuna fifo che sia stata aperta, che può
506 essere acceduta contemporaneamente da più processi, sia in lettura che in
507 scrittura. Dato che per funzionare deve essere aperta in entrambe le
508 direzioni, per una fifo di norma la funzione \func{open} si blocca se viene
509 eseguita quando l'altro capo non è aperto.
510
511 Le fifo però possono essere anche aperte in modalità \textsl{non-bloccante},
512 nel qual caso l'apertura del capo in lettura avrà successo solo quando anche
513 l'altro capo è aperto, mentre l'apertura del capo in scrittura restituirà
514 l'errore di \macro{ENXIO} fintanto che non verrà aperto il capo in lettura.
515
516 In Linux\footnote{lo standard POSIX lascia indefinito questo comportamento.} è
517 possibile aprire le fifo anche in lettura/scrittura, operazione che avrà
518 sempre successo immediato qualunque sia la modalità di apertura (bloccante e
519 non bloccante); questo può essere utilizzato per aprire comunque una fifo in
520 scrittura anche se non ci sono ancora processi il lettura; è possibile anche
521 usare la fifo all'interno di un solo processo, nel qual caso però occorre
522 stare molto attenti alla possibili deadlock.\footnote{se si cerca di leggere
523   da una fifo che non contiene dati si avrà un deadlock immediato, dato che il
524   processo si blocca e non potrà quindi mai eseguire le funzioni di
525   scrittura.}
526
527 Per la loro caratteristica di essere accessibili attraverso il filesystem, è
528 piuttosto frequente l'utilizzo di una fifo come canale di comunicazione nelle
529 situazioni un processo deve ricevere informazioni dagli altri. In questo caso
530 è fondamentale che le operazioni di scrittura siano atomiche; per questo si
531 deve sempre tenere presente che questo è vero soltanto fintanto che non si
532 supera il limite delle dimensioni di \macro{PIPE\_BUF} (si ricordi quanto
533 detto in \secref{sec:ipc_pipes}).
534
535 A parte il precedente, che resta probabilmente il più comune, Stevens riporta
536 in \cite{APUE} altre due casistiche principali per l'uso delle fifo:
537 \begin{itemize}
538 \item Da parte dei comandi di shell, per evitare la creazione di file
539   temporanei quando si devono inviare i dati di uscita di un processo
540   sull'input di parecchi altri (attraverso l'uso del comando \cmd{tee}).
541   
542 \item Come canale di comunicazione fra un client ed un server (il modello
543   \textit{client-server} è illustrato in \secref{sec:net_cliserv}).
544 \end{itemize}
545
546 Nel primo caso quello che si fa è creare tante pipe quanti sono i processi a
547 cui i vogliono inviare i dati, da usare come standard input per gli stessi; una
548 volta che li si saranno posti in esecuzione ridirigendo lo standard input si
549 potrà eseguire il processo iniziale replicandone, con il comando \cmd{tee},
550 l'output sulle pipe.
551
552 Il secondo caso è relativamente semplice qualora si debba comunicare con un
553 processo alla volta (nel qual caso basta usare due pipe, una per leggere ed
554 una per scrivere), le cose diventano invece molto più complesse quando si
555 vuole effettuare una comunicazione fra il server ed un numero imprecisato di
556 client; se il primo infatti può ricevere le richieste attraverso una fifo
557 ``nota'', per le risposte non si può fare altrettanto, dato che per la
558 struttura sequenziale delle fifo, i client dovrebbero sapere, prima di
559 leggerli, quando i dati inviati sono destinati a loro.
560
561 Per risolvere questo problema, si può usare un'architettura come quella
562 illustrata da Stevens in \cite{APUE}, in cui le risposte vengono inviate su
563 fifo temporanee identificate dal \acr{pid} dei client, ma in ogni caso il
564 sistema è macchinoso e continua ad avere vari inconvenienti\footnote{lo stesso
565   Stevens nota come sia impossibile per il server sapere se un client è andato
566   in crash, con la possibilità di far restare le fifo temporanee sul
567   filesystem, come sia necessario intercettare \macro{SIGPIPE} dato che un
568   client può terminare dopo aver fatto una richiesta, ma prima che la risposta
569   sia inviata, e come occorra gestire il caso in cui non ci sono client attivi
570   (e la lettura dalla fifo nota restituisca al serve un end-of-file.}; in
571 generale infatti l'interfaccia delle fifo non è adatta a risolvere questo tipo
572 di problemi, che possono essere affrontati in maniera più semplice ed efficace
573 o usando i \textit{socket}\index{socket} (che tratteremo in dettaglio a
574 partire da \capref{cha:socket_intro}) o ricorrendo a diversi meccanismi di
575 comunicazione, come quelli che esamineremo in \secref{sec:ipc_sysv}.
576
577
578
579 \section{La comunicazione fra processi di System V}
580 \label{sec:ipc_sysv}
581
582 Benché le pipe (e le fifo) siano ancora ampiamente usate, esse presentano
583 numerosi limiti, il principale dei quali è che il meccanismo di comunicazione
584 è rigidamente sequenziale; per cui una situazione in cui un processo scrive
585 qualcosa che molti altri devono poter leggere non può essere implementata in
586 maniera semplice con una pipe.
587
588 Per superarne questi limiti nello sviluppo di System V vennero introdotti una
589 serie di nuovi oggetti di comunicazione e relative interfacce di
590 programmazione che garantissero una maggiore flessibilità; in questa sezione
591 esamineremo quello che viene ormai chiamato il \textsl{Sistema di
592   comunicazione inter-processo} di System V , più comunemente noto come
593 \textit{System V IPC (Inter-Process Comunication)}.
594
595
596
597 \subsection{Considerazioni generali}
598 \label{sec:ipc_sysv_generic}
599
600 La principale caratteristica, (che può essere considerato anche uno dei suoi
601 maggiori difetti) del sistema di IPC di System V è che è basato su oggetti che
602 risiedono nel kernel, a differenza delle pipe che sono locali ai processi che
603 condividono lo stesso file descriptor, e delle fifo, cui invece si accede
604 attraverso il filesystem. 
605
606 Ad essi si accede attraverso un identificatore generato autonomamente dal
607 kernel alla loro creazione (come un numero intero progressivo, in maniera
608 simile a quanto fatto per i \acr{pid}). A ciascun oggetto è pure associata una
609 chiave, che di norma viene usata per ricavare l'identificatore. 
610
611 Una seconda caratteristica di questi oggetti è che non prevedono un numero di
612
613
614
615
616
617  
618
619 \subsection{Code di messaggi}
620 \label{sec:ipc_messque}
621
622 Il primo oggetto introdotto dal \textit{System V IPC} è quello delle code di
623 messaggi.
624
625 \subsection{Semafori}
626 \label{sec:ipc_semaph}
627
628 Il secondo oggetto introdotto dal \textit{System V IPC} è quello dei semafori.
629
630
631 \subsection{Memoria condivisa}
632 \label{sec:ipc_shar_mem}
633
634 Il terzo oggetto introdotto dal \textit{System V IPC} è quello della memoria
635 condivisa.
636
637
638
639
640 \section{La comunicazione fra processi di POSIX}
641 \label{sec:ipc_posix}
642
643 Lo standard POSIX.1b ha introdotto dei nuovi meccanismi di comunicazione,
644 rifacendosi a quelli di System V, introducendo una nuova interfaccia che
645 evitasse i principali problemi evidenziati in ...
646
647
648
649
650 %%% Local Variables: 
651 %%% mode: latex
652 %%% TeX-master: "gapil"
653 %%% End: