3c30111cebf747b7316715bdcc672a4e373b441c
[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
105 \subsection{Un esempio dell'uso delle pipe}
106 \label{sec:ipc_pipe_use}
107
108 Per capire meglio il funzionamento di una pipe faremo un esempio di quello che
109 è il loro uso più comune, analogo a quello effettuato della shell, e che
110 consiste nell'inviare l'output di un processo (lo standard output) sull'input
111 di un'altro. Realizzaremo il programma nella forma di un
112 \textit{CGI}\footnote{Un CGI (\textit{Common Gateway Interface}) è un programma
113   che permette la creazione dinamica di un oggetto da inserire all'interno di
114   una pagina HTML.}  per apache, che genera una immagine JPEG di un codice a
115 barre, specificato come parametro di input.
116
117 Un programma che deve essere eseguito come \textit{CGI} deve rispondere a
118 delle caratteristiche specifiche, esso infatti non viene lanciato da una
119 shell, ma dallo stesso web server, alla richiesta di una specifica URL, che di
120 solito ha la forma:
121 \begin{verbatim}
122     http://www.sito.it/cgi-bin/programma?parametro
123 \end{verbatim}
124 ed il risultato dell'elaborazione deve essere presentato (con una intestazione
125 che ne descrive il mime-type) sullo standard output, in modo che il web-server
126 possa reinviarlo al browser che ha effettuato la richiesta, che in questo modo
127 è in grado di visualizzarlo opportunamente.
128
129 Per fare questo useremo in sequenza i programmi \cmd{barcode} e \cmd{gs}, il
130 primo infatti è in grado di generare immagini postscript di codici a barre
131 corrispondenti ad una qualunque stringa, mentre il secondo serve per poter
132 effettuare la conversione della stessa immagine in formato JPEG. Usando una
133 pipe potremo inviare l'output del primo sull'input del secondo, secondo lo
134 schema mostrato in \figref{fig:ipc_pipe_use}, in cui la direzione del flusso
135 dei dati è data dalle frecce continue.
136
137 \begin{figure}[htb]
138   \centering
139   \includegraphics[height=5cm]{img/pipeuse}
140   \caption{Schema dell'uso di una pipe come mezzo di comunicazione fra
141     due processi attraverso attraverso l'esecuzione una \func{fork} e la
142     chiusura dei capi non utilizzati.}
143   \label{fig:ipc_pipe_use}
144 \end{figure}
145
146 Si potrebbe obiettare che sarebbe molto più semplice salvare il risultato
147 intermedio su un file temporaneo. Questo però non tiene conto del fatto che un
148 \textit{CGI} deve poter gestire più richieste in concorrenza, e si avrebbe una
149 evidente race condition in caso di accesso simultaneo a detto
150 file.\footnote{il problema potrebbe essere superato determinando in anticipo
151   un nome appropiato per il file temporaneo, che verrebbe utilizzato dai vari
152   sotto-processi, e cancellato alla fine della loro esecuzione; ma a questo le
153   cose non sarebbero più tanto semplici.}  L'uso di una pipe invece permette
154 di risolvere il problema in maniera semplice ed elegante.
155
156 Il programma ci servirà anche come esempio dell'uso delle funzioni di
157 duplicazione dei file descriptor che abbiamo trattato in
158 \secref{sec:file_dup}, in particolare di \func{dup2}. È attraverso queste
159 funzioni infatti che è possibile dirottare gli stream standard dei processi
160 (che abbiamo visto in \secref{sec:file_std_descr} e
161 \secref{sec:file_std_stream}) sulla pipe. In \figref{fig:ipc_barcode_code}
162 abbiamo riportato il corpo del programm, il cui codice completo è disponibile
163 nel file \file{BarCodePage.c} che si trova nella directory dei sorgenti.
164
165
166 \begin{figure}[!htb]
167   \footnotesize \centering
168   \begin{minipage}[c]{15cm}
169     \begin{lstlisting}{}
170 int main(int argc, char *argv[], char *envp[])
171 {
172     ...
173     /* create two pipes to handle process communication */
174     if ( (retval = pipe(pipein)) ) {
175         WriteMess("input pipe creation error");
176         exit(0);        
177     }
178     if ( (retval = pipe(pipeout)) ) {
179         WriteMess("output pipe creation error");
180         exit(0);        
181     }    
182     /* First fork: use child to run barcode program */
183     if ( (pid = fork()) == -1) {          /* on error exit */
184         WriteMess("child creation error");
185         exit(0);        
186     }
187     /* if child */
188     if (pid == 0) {
189         close(pipein[1]);                /* close pipe write end  */
190         dup2(pipein[0], STDIN_FILENO);   /* remap stdin to pipe read end */
191         close(pipeout[0]);
192         dup2(pipeout[1], STDOUT_FILENO); /* remap stdout in pipe output */
193         execlp("barcode", "barcode", size, NULL); //"-o", "-",  NULL);
194     } 
195     close(pipein[0]);                    /* close input side of input pipe */
196     write(pipein[1], argv[1], strlen(argv[1]));  /* write parameter to pipe */
197     close(pipein[1]);                    /* closing write end */
198     waitpid(pid, NULL, 0);               /* wait child completion */
199     /* Second fork: use child to run ghostscript */
200     if ( (pid = fork()) == -1) {          /* on error exit */
201         WriteMess("child creation error");
202         exit(0);
203     }
204     /* second child, convert PS to JPEG  */
205     if (pid == 0) {                     
206         close(pipeout[1]);              /* close write end */
207         dup2(pipeout[0], STDIN_FILENO); /* remap read end to stdin */
208         /* send mime type */
209         write(STDOUT_FILENO, content, strlen(content));
210         execlp("gs", "gs", "-q", "-sDEVICE=jpeg", "-sOutputFile=-", "-", NULL);
211     }
212     /* still parent */
213     close(pipeout[1]); 
214     waitpid(pid, NULL, 0);
215     exit(0);
216 }
217     \end{lstlisting}
218   \end{minipage} 
219   \normalsize 
220   \caption{Sezione principale del codice del \textit{CGI} 
221     \file{BarCodePage.c}.}
222   \label{fig:ipc_barcode_code}
223 \end{figure}
224
225 La prima operazione del programma (\texttt{\small 4--12}) è quella di creare
226 le due pipe che serviranno per la comunicazione fra i due comandi utilizzati
227 per produrre il codice a barre; si ha cura di controllare la riuscita della
228 chiamata, inviando in caso di errore un messaggio invece dell'immagine
229 richiesta.\footnote{la funzione \func{WriteMess}, non è riportata in
230   \secref{fig:ipc_barcode_code}; essa si incarica semplicemente di formattare
231   l'uscita alla maniera dei CGI, aggiungendo l'opportuno \textit{mime type}, e
232   formattando il messaggio in HTML, in modo che quest'ultimo possa essere
233   visualizzato correttamente da un browser.}
234
235 Una volta create le pipe, il programma può creare (\texttt{\small 13-17}) il
236 primo processo figlio, che si incaricherà (\texttt{\small 19--25}) di eseguire
237 \cmd{barcode}. Quest'ultimo legge dallo standard input una stringa di
238 caratteri, la converte nell'immagine postscript del codice a barre ad essa
239 corrispondente, e poi scrive il risultato direttamente sullo standard output.
240
241 Per poter utilizzare queste caratteristiche prima di eseguire \cmd{barcode} si
242 chiude (\texttt{\small 20}) il capo aperto in scrittura della prima pipe, e se
243 ne collega (\texttt{\small 21}) il capo in lettura allo standard input, usando
244 \func{dup2}. Si ricordi che invocando \func{dup2} il secondo file, qualora
245 risulti aperto, viene, come nel caso corrente, chiuso prima di effettuare la
246 duplicazione. Allo stesso modo, dato che \cmd{barcode} scrive l'immagine
247 postscript del codice a barre sullo standard output, per poter effettuare una
248 ulteriore redirezione il capo in lettura della seconda pipe viene chiuso
249 (\texttt{\small 22}) mentre il capo in scrittura viene collegato allo standard
250 output (\texttt{\small 23}).
251
252 In questo modo all'esecuzione (\texttt{\small 25}) di \cmd{barcode} (cui si
253 passa in \var{size} la dimensione della pagina per l'immagine) quest'ultimo
254 leggerà dalla prima pipe la stringa da codificare che gli sarà inviata dal
255 padre, e scriverà l'immagine postscript del codice a barre sulla seconda.
256
257 Al contempo una volta lanciato il primo figlio, il processo padre prima chiude
258 (\texttt{\small 26}) il capo inutilizzato della prima pipe (quello in input) e
259 poi scrive (\texttt{\small 27}) la stringa da convertire sul capo in output,
260 così che \cmd{barcode} possa riceverla dallo standard input. A questo punto
261 l'uso della prima pipe da parte del padre è finito ed essa può essere
262 definitivamente chiusa (\texttt{\small 28}), si attende poi (\texttt{\small
263   29}) che l'esecuzione di \cmd{barcode} sia completata.
264
265 Alla conclusione della sua esecuzione \cmd{barcode} avrà inviato l'immagine
266 postscript del codice a barre sul capo in scrittura della seconda pipe; a
267 questo punto si può eseguire la seconda conversione, da PS a JPEG, usando il
268 programma \cmd{gs}. Per questo si crea (\texttt{\small 30--34}) un secondo
269 processo figlio, che poi (\texttt{\small 35--42}) eseguirà questo programma
270 leggendo l'immagine postscript creata da \cmd{barcode} dallo standard input,
271 per convertirla in JPEG.
272
273 Per fare tutto ciò anzitutto si chiude (\texttt{\small 37}) il capo in
274 scrittura della seconda pipe, e se ne collega (\texttt{\small 38}) il capo in
275 lettura allo standard input. Per poter formattare l'output del programma in
276 maniera utilizzabile da un browser, si provvede anche \texttt{\small 40}) alla
277 scrittura dell'apposita stringa di identificazione del mime-type in testa allo
278 standard output. A questo punto si può invocare \texttt{\small 41}) \cmd{gs},
279 provvedendo gli appositi switch che consentono di leggere il file da
280 convertire dallo standard input e di inviare la conversione sullo standard
281 output.
282
283 Per completare le operazioni il processo padre chiude (\texttt{\small 44}) il
284 capo in scrittura della seconda pipe, e attende la conclusione del figlio
285 (\texttt{\small 45}); a questo punto può (\texttt{\small 46}) uscire. Si tenga
286 conto che l'operazione di chiudere il capo in scrittura della seconda pipe è
287 necessaria, infatti, se non venisse chiusa, \cmd{gs}, che legge il suo
288 stardard input da detta pipe, resterebbe bloccato in attesa di ulteriori dati
289 in ingresso (l'unico modo che un programma ha per sapere che l'input è
290 terminato è rilevare che lo standard input è stato chiuso), e la \func{wait}
291 non ritornerebbe.
292
293
294 \subsection{Le funzioni \func{popen} e \func{pclose}}
295 \label{sec:ipc_popen}
296
297 Come si è visto la modalità più comune di utilizzo di una pipe è quella di
298 utilizzarla per fare da tramite fra output ed input di due programmi invocati
299 in sequenza; per questo motivo lo standard POSIX.2 ha introdotto due funzioni
300 che permettono di sintetizzare queste operazioni. La prima di esse si chiama
301 \func{popen} ed il suo prototipo è:
302 \begin{prototype}{stdio.h}
303 {FILE *popen(const char *command, const char *type)}
304
305 Esegue il programma \param{command}, di cui, a seconda di \param{type},
306 restituisce, lo standard input o lo standard output nella pipe collegata allo
307 stream restituito come valore di ritorno.
308   
309 \bodydesc{La funzione restituisce l'indirizzo dello stream associato alla pipe
310   in caso di successo e \macro{NULL} per un errore, nel qual caso \var{errno}
311   potrà assumere i valori relativi alle sottostanti invocazioni di \func{pipe}
312   e \func{fork} o \macro{EINVAL} se \param{type} non è valido.}
313 \end{prototype}
314
315 La funzione crea una pipe, esegue una \func{fork}, ed invoca il programma
316 \param{command} attraverso la shell (in sostanza esegue \file{/bin/sh} con il
317 flag \code{-c}); l'argomento \param{type} deve essere una delle due stringhe
318 \verb|"w"| o \verb|"r"|, per indicare se la pipe sarà collegata allo standard
319 input o allo standard output del comando invocato.
320
321 La funzione restituisce il puntatore allo stream associato alla pipe creata,
322 che sarà aperto in sola lettura (e quindi associato allo standard output del
323 programma indicato) in caso si sia indicato \code{"r"}, o in sola scrittura (e
324 quindi associato allo standard input) in caso di \code{"w"}.
325
326 Lo stream restituito da \func{popen} è identico a tutti gli effetti ai file
327 stream visti in \secref{cha:files_std_interface}, anche se è collegato ad una
328 pipe e non ad un inode, e viene sempre aperto in modalità
329 \textit{fully-buffered} (vedi \secref{sec:file_buffering}); l'unica differenza
330 con gli usuali stream è che dovrà essere chiuso dalla seconda delle due nuove
331 funzioni, \func{pclose}, il cui prototipo è:
332 \begin{prototype}{stdio.h}
333 {int pclose(FILE *stream)}
334
335 Chiude il file \param{stream}, restituito da una prededente \func{popen}
336 attendendo la terminazione del processo ad essa associato.
337   
338 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
339   errore; nel quel caso il valore di \func{errno} deriva dalle sottostanti
340   chiamate.}
341 \end{prototype}
342 \noindent che oltre alla chiusura dello stream si incarica anche di attendere
343 (tramite \func{wait4}) la conclusione del processo creato dalla precedente
344 \func{popen}.
345
346 Per illustrare l'uso di queste due funzioni riprendiamo il problema
347 precedente: il programma mostrato in \figref{fig:ipc_barcode_code} per quanto
348 funzionante, è (volutamente) codificato in maniera piuttosto complessa,
349 inoltre nella pratica sconta un problema di \cmd{gs} che non è in
350 grado\footnote{nella versione GNU Ghostscript 6.53 (2002-02-13).} di
351 riconoscere correttamente l'encapsulated postscript, per cui deve essere usato
352 il postscript e tutte le volte viene generata una pagina intera, invece che
353 una immagine delle dimensioni corrispondenti al codice a barre.
354
355 Se si vuole generare una immagine di dimensioni appropriate si deve usare un
356 approccio diverso. Una possibilità sarebbe quella di ricorrere ad ulteriore
357 programma, \cmd{epstopsf}, per convertire in PDF un file EPS (che può essere
358 generato da \cmd{barcode} utilizzando lo switch \cmd{-E}).  Utilizzando un PDF
359 al posto di un EPS \cmd{gs} esegue la conversione rispettando le dimensioni
360 originarie del codice a barre e produce un JPEG delle dimensioni adeguate.
361
362 Questo però ci porta a scontrarci con una caratteristica peculiare delle pipe,
363 che a prima vista non è evidente. Per poter effettuare la conversione di un
364 PDF infatti è necessario, per la struttura del formato, dover eseguire delle
365 \func{lseek} sul file da convertire; se si esegue \cmd{gs} su un file normale
366 non ci sono problemi, ma una pipe però è rigidamente sequenziale, ed il
367 tentativo di eseguire detta operazione su una pipe comporta l'immediato
368 fallimento con un errore di \macro{ESPIPE}.  Questo ci dice che in generale la
369 concatenazione di vari programmi funzionerà soltanto quando tutti prevedono
370 una lettura sequenziale del loro input.
371
372 Per questo motivo si è dovuto utilizzare una strada diversa, che prevede la
373 conversione attraverso \cmd{gs} del PS in un altro formato intermedio, il
374 PPM,\footnote{il \textit{Portable PixMap file format} è un formato usato
375   spesso come formato intermedio per effettuare conversioni, è estremamente
376   inefficiente, ma molto facile da manipolare dato che usa caratteri ASCII per
377   memorizzare le immagini.} dal quale poi si può ottenere un'immagine di
378 dimensioni corrette attraverso vari programmi di manipolazione (\cmd{pnmcrop},
379 \cmd{pnmmargin}) che può essere infine trasformata in PNG (con \cmd{pnm2png}).
380
381 In questo caso però occorre eseguire in sequenza ben quattro comandi diversi,
382 inviando l'output di ciascuno all'input del successivo, per poi ottenere il
383 risultato finale sullo standard output; un caso classico di utilizzazione
384 delle pipe, in cui l'uso di \func{popen} e \func{pclose} permette di
385 semplificare notevolmente la stesura del codice.
386
387 Nel nostro caso, dato che ciascun processo deve scrivere il suo output sullo
388 standard input del successivo, occorrerà usare \func{popen} aprendo la pipe in
389 scrittura. Il codice del nuovo programma è riportato in
390 \figref{fig:ipc_barcode2_code}.  Come si può notare l'ordine di invocazione
391 dei programmi è l'inverso di quello in cui ci si aspetta vengano
392 effettivamente eseguiti. Questo non comporta nessun problema; infatti la
393 lettura su una pipe è bloccante, per cui ciascun processo, per quanto lanciato
394 per primo, si bloccherà in attesa di ricevere sullo standard input il
395 risultato dell'elaborazione del precendente, benchè quest'ultimo venga
396 invocato dopo.
397
398 \begin{figure}[!htb]
399   \footnotesize \centering
400   \begin{minipage}[c]{15cm}
401     \begin{lstlisting}{}
402 int main(int argc, char *argv[], char *envp[])
403 {
404     FILE *pipe[4];
405     FILE *pipein;
406     char *cmd_string[4]={
407         "pnmtopng",
408         "pnmmargin -white 10",
409         "pnmcrop",
410         "gs -sDEVICE=ppmraw -sOutputFile=- -sNOPAUSE -q - -c showpage -c quit"
411     };  
412     char content[]="Content-type: image/png\n\n";
413     int i;
414     /* write mime-type to stout */ 
415     write(STDOUT_FILENO, content, strlen(content));
416     /* execute chain of command */
417     for (i=0; i<4; i++) {
418         pipe[i] = popen(cmd_string[i], "w");
419         dup2(fileno(pipe[i]), STDOUT_FILENO); 
420     }
421     /* create barcode (in PS) */
422     pipein = popen("barcode", "w");
423     /* send barcode string to barcode program */
424     write(fileno(pipein), argv[1], strlen(argv[1]));
425     /* close all pipes (in reverse order) */
426     for (i=4; i==0; i--) {
427         pclose((pipe[i]));
428     }
429     exit(0);
430 }
431 void WriteMess(char *mess)
432 {
433     printf("Content-type: text/html\n\n");
434     perror(mess);
435     printf("<br>\n");
436 }
437     \end{lstlisting}
438   \end{minipage} 
439   \normalsize 
440   \caption{Codice completo del \textit{CGI} \file{BarCode.c}.}
441   \label{fig:ipc_barcode_code}
442 \end{figure}
443
444 Nel nostro caso il primo passo (\texttt{\small 14}) è scrivere il mime-type
445 sullo standard output; a questo punto il processo padre non necessita più di
446 eseguire ulteriori operazioni sullo standard output e può tranquillamente
447 provvedere alla redirezione.
448
449 Dato che i vari programmi devono essere lanciati in successione, si è
450 approntato un ciclo (\texttt{\small 15--19}) che esegue le operazioni in
451 sequenza: prima crea una pipe (\texttt{\small 17}) per la scrittura eseguendo
452 il programma con \func{popen}, in modo che essa sia collegata allo standard
453 input, e poi redirige (\texttt{\small 18}) lo standard output su detta pipe.
454
455 In questo modo il primo processo ad essere invocato (che è l'ultimo della
456 catena) scriverà ancora sullo standard output del processo padre, ma i
457 successivi, a causa di questa redirezione, scriveranno sulla pipe associata
458 allo standard input del processo invocato nel ciclo precedente.
459
460 Alla fine tutto quello che resta da fare è lanciare (\texttt{\small 21}) il
461 primo processo della catena, che nel caso è \cmd{barcode}, e scrivere
462 (\texttt{\small 23}) la stringa del codice a barre sulla pipe, che è collegata
463 al suo standard input, infine si può eseguire (\texttt{\small 24--27}) un
464 ciclo, che chiuda, nell'ordine inverso rispetto a quello in cui le si sono
465 create, tutte le pipe create con \func{pclose}.
466
467
468 \subsection{Le \textit{pipe} con nome, o \textit{fifo}}
469 \label{sec:ipc_named_pipe}
470
471 Come accennato in \secref{sec:ipc_pipes} il problema delle \textit{pipe} è che
472 esse possono essere utilizzate solo da processi con un progenitore comune o
473 nella relazione padre/figlio; per superare questo problema lo standard POSIX.1
474 ha definito dei nuovi oggetti, le \textit{fifo}, che hanno le stesse
475 caratteristiche delle pipe, ma invece che essere struttura interne del kernel
476 visibili solo attraverso un file descriptor comune, possono essere viste
477 attraverso un inode che risiede sul filesystem.
478
479 Utilizzando una fifo tutti i dati passeranno attraverso un apposito buffer nel
480 kernel, senza transitare dal filesystem, l'inode serve solo a fornire un punto
481 d'appoggio per i vari processi che permetta loro di accedere alla stessa
482 fifo.  
483
484
485
486
487 Abbiamo già visto in \secref{sec:file_mknod} le modalità che permettono di
488 creare una fifo, attraverso le funzioni \func{mknod} e \func{mkfifo}; per
489 utilizzarle un processo non avrà che da aprire il relativo file in lettura o
490 scrittura (a seconda della direzione che si vuole dare ai dati).
491
492 che invece possono risiedere
493 sul filesystem, e che i processi possono usare per le comunicazioni senza
494 dovere per forza essere in relazione diretta.
495
496
497
498
499 Per poter superare il problema delle \textit{pipe}, illustrato in
500 \secref{sec:ipc_pipes}, che ne consente l'uso solo fra processi con un
501 progenitore comune o nella relazione padre/figlio,
502   
503 \section{La comunicazione fra processi di System V}
504 \label{sec:ipc_sysv}
505
506 Per ovviare ai vari limiti dei meccanismo tradizionale di comunicazione fra
507 processi visto in \secref{sec:ipc_unix}, nello sviluppo di System V vennero
508 introdotti una serie di nuovi oggetti e relative interfacce che garantissero
509 una maggiore flessibilità; in questa sezione esamineremo quello che viene
510 ormai chiamato il \textit{System V Inter-Process Comunication System}, più
511 comunemente noto come \textit{SystemV IPC}.
512  
513
514 \subsection{Code di messaggi}
515 \label{sec:ipc_messque}
516
517 Il primo oggetto introdotto dal \textit{SystemV IPC} è quello delle code di
518 messaggi.
519
520 \subsection{Semafori}
521 \label{sec:ipc_semaph}
522
523 Il secondo oggetto introdotto dal \textit{SystemV IPC} è quello dei semafori.
524
525
526 \subsection{Memoria condivisa}
527 \label{sec:ipc_shar_mem}
528
529 Il terzo oggetto introdotto dal \textit{SystemV IPC} è quello della memoria
530 condivisa.
531
532 %%% Local Variables: 
533 %%% mode: latex
534 %%% TeX-master: "gapil"
535 %%% End: