352a7197b9435ea9ff4217540c72efb3ef18dc47
[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 attaverso 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 dell'uso di una pipe come mezzo di comunicazione fra
90   processo attraverso una \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   riporta in APUE come limite anche il fatto che la comunicazione è
98   unidirezionale, in realtà questo è un limite facilmente risolvibile 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
106 \subsection{Un esempio dell'uso delle pipe}
107 \label{sec:ipc_pipe_use}
108
109 Per capire meglio il funzionamento di una pipe faremo un esempio di quello che
110 è il loro uso più comune, analogo a quello effettuato della shell, e che
111 consiste nell'inviare l'output di un processo (lo standard output) sull'input
112 di un'altro. Realizzaremo il programma nella forma di un
113 \textit{cgi-bin}\footnote{breve descrizione, da fare, di cosa è un cgi-bin.}
114 per apache, che genera una immagine JPEG di un codice a barre, specificato
115 come parametro di input.
116
117 Per fare questo useremo i programmi \cmd{barcode} e \cmd{gs}, il primo infatti
118 è in grado di generare immagini postscript di codici a barre corrispondenti ad
119 una qualunque stringa, data come parametro, mentre il secondo è in grado di
120 convertire un file postscript in una immagine JPEG. Usando l'ouptut del primo
121 come input del secondo attraverso una pipe potremo generare immagini JPEG del
122 codice a barre di una stringa qualunque. 
123
124 Si potrebbe obiettare che sarebbe molto più semplice ottenere lo stesso
125 risultato salvando il tutto in un file temporaneo, ma si dovrebbe comunque
126 risolvere il problema di come comunicare il nome di questo file da un processo
127 all'altro, dato che utilizzare lo stesso file porterebbe ad inevitabili
128 sovrascritture nell'accavallarsi di diversi processi. L'uso di una pipe
129 permette di risolvere il problema in maniera semplice ed elegante.
130
131 Il programma ci servirà anche come esempio dell'uso di alcune delle funzioni
132 di manipolazione dei file descriptor, come \func{dup} e \func{dup2}, viste in 
133 \secref{sec:file_dup}
134
135
136
137 \subsection{Le \textit{pipe} con nome, o \textit{fifo}}
138 \label{sec:ipc_named_pipe}
139
140 Per poter superare il problema delle \textit{pipe}, illustrato in
141 \secref{sec:ipc_pipes}, che ne consente l'uso solo fra procesi con un
142 progenitore comune o nella relazione padre/figlio, lo standard POSIX.1
143 definisce dei nuovi oggetti, le \textit{fifo}, che invece possono risiedere
144 sul filesystem, e che i processi possono usare per le comunicazioni senza
145 dovere per forza essere in relazione diretta.
146
147
148
149   
150 \section{La comunicazione fra processi di System V}
151 \label{sec:ipc_sysv}
152
153 Per ovviare ai vari limiti dei meccanismo tradizionale di comunicazione fra
154 processi visto in \secref{sec:ipc_unix}, nello sviluppo di System V vennero
155 introdotti una serie di nuovi oggetti e relative interdacce che garantissero
156 una maggiore flessibilità; in questa sezione esamineremo quello che viene
157 ormai chiamato il \textit{System V Inter-Process Comunication System}, più
158 comunemente noto come \textit{SystemV IPC}.
159  
160
161 \subsection{Code di messaggi}
162 \label{sec:ipc_messque}
163
164 Il primo oggetto introdotto dal \textit{SystemV IPC} è quello delle code di
165 messaggi.
166
167 \subsection{Semafori}
168 \label{sec:ipc_semaph}
169
170 Il secondo oggetto introdotto dal \textit{SystemV IPC} è quello dei semafori.
171
172
173 \subsection{Memoria condivisa}
174 \label{sec:ipc_shar_mem}
175
176 Il terzo oggetto introdotto dal \textit{SystemV IPC} è quello della memoria
177 condivisa.
178
179 %%% Local Variables: 
180 %%% mode: latex
181 %%% TeX-master: "gapil"
182 %%% End: