X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=24ec8f4685d898ded65d4675bc4cc6c6020a62e5;hp=f86a851e9fb41c5b43913f428d8e80354758fd15;hb=aa5d63f2af4475ae1188f695a33e4d0bee55f787;hpb=fd934ebcf645120b9c92a434ab6b8755c04a3c07 diff --git a/ipc.tex b/ipc.tex index f86a851..24ec8f4 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2,18 +2,19 @@ \label{cha:IPC} -\section{Introduzione} -\label{sec:ipc_intro} +Uno degli aspetti fondamentali della programmazione in un sistema unix-like è +la comunicazione fra processi. In questo capitolo affronteremo solo i +meccanismi più elementari che permettono di mettere in comunicazione processi +diversi, come quelli tradizionali che coinvolgono \textit{pipe} e +\textit{fifo} e i meccanismi di intercomunicazione di System V. -Uno degli aspetti fondamentali della programmazione in unix è la comunicazione -fra processi. In questo capitolo affronteremo solo alcuni dei meccanismi più -elementari che permettono di mettere in comunicazione processi diversi, come -quelli tradizionali che coinvolgono \textit{pipe} e \textit{fifo} e i -meccanismi di intercomunicazione di System V. +Tralasceremo invece tutte le problematiche relative alla comunicazione +attraverso la rete (e le relative interfacce) che saranno affrontate in gran +dettaglio in un secondo tempo. Non affronteremo invece meccanismi più +complessi ed evoluti come le RPC (\textit{Remote Procedure Calls}) e CORBA +(\textit{Common Object Request Brocker Architecture}) che in genere sono +implementati con un ulteriore livello sopra i meccanismi elementari. -Esistono pure sistemi più complessi ed evoluti come le RPC (\textit{Remote - Procedure Calls}) e CORBA (\textit{Common Object Request Brocker - Architecture}) che non saranno affrontati qui. \section{La comunicazione fra processi tradizionale} @@ -27,32 +28,79 @@ funzioni che ne gestiscono l'uso e le varie forme in cui si \subsection{Le \textit{pipe} standard} \label{sec:ipc_pipes} +Le \textit{pipe} nascono sostanzialmente con Unix, e sono il primo, ed uno dei +più usati, meccanismi di comunicazione fra processi. Si tratta in sostanza uno +speciale tipo di file\footnote{più precisamente un file descriptor; le pipe + sono create dal kernel e non risiedono su disco.} in cui un processo scrive +ed un altro legge. Si viene così a costituire un canale di comunicazione fra i +due processi, nella forma di un \textsl{tubo} (da cui il nome) in cui uno dei +processi immette dati che poi arriveranno all'altro. + +Perché questo accada però, e questo è il principale\footnote{Stevens riporta + in APUE come limite anche il fatto che la comunicazione è unidirezionale, in + realtà questo è un limite facilemente risolvibile usando una coppia di + \textit{pipe}.} e limite nell'uso delle \textit{pipe}, è necessario che +questi processi possano condividere il file descriptor della \textit{pipe}; +per questo essi devono comunque derivare da uno stesso processo padre, o, più +comunemente, essere nella relazione padre/figlio. + +La funzione che permette di creare una \textit{pipe} è appunto \func{pipe}; il +suo prototipo è: +\begin{prototype}{unistd.h} +{int pipe(int filedes[2])} + +Crea una coppia di file descriptor associati ad una \textit{pipe}. + + \bodydesc{La funzione restituisce zero in caso di successo e -1 per un + errore, nel qual caso \var{errno} potrà assumere i valori \macro{EMFILE}, + \macro{ENFILE} e \macro{EFAULT}.} +\end{prototype} + +La funzione restituisce una coppia di file descriptor nell'array +\param{filedes}; il primo aperto in lettura ed il secondo in scrittura + \subsection{Le \textit{pipe} con nome, o \textit{fifo}} \label{sec:ipc_named_pipe} +Per poter superare il problema delle \textit{pipe} originali, che consentono +la comunicazione solo fra processi correlati, passando attraverso strutture +interne del kernel, sono stati introdotti dei nuovi oggetti, le \textit{fifo}, +che invece possono risiedere sul filesystem, e che i processi possono usare +per le comunicazioni senza dovere per forza essere in relazione diretta. + \section{La comunicazione fra processi di System V} \label{sec:ipc_sysv} -Per ovviare ad i vari limiti dei meccanismo tradizionale di comunicazione fra -processi basato sulle \textit{pipe}, nello sviluppo di System V vennero -introdotti una serie di nuovi oggetti che garantissero una maggiore -flessibilità; in questa sezione esamineremo quello che viene ormai chiamato il -sistema \textit{SystemV IPC}. +Per ovviare ai vari limiti dei meccanismo tradizionale di comunicazione fra +processi visto in \secref{sec:ipc_unix}, nello sviluppo di System V vennero +introdotti una serie di nuovi oggetti e relative interdacce che garantissero +una maggiore flessibilità; in questa sezione esamineremo quello che viene +ormai chiamato il \textit{System V Inter-Process Comunication System}, più +comunemente noto come \textit{SystemV IPC}. + \subsection{Code di messaggi} \label{sec:ipc_messque} +Il primo oggetto introdotto dal \textit{SystemV IPC} è quello delle code di +messaggi. + \subsection{Semafori} \label{sec:ipc_semaph} +Il secondo oggetto introdotto dal \textit{SystemV IPC} è quello dei semafori. + + \subsection{Memoria condivisa} \label{sec:ipc_shar_mem} +Il terzo oggetto introdotto dal \textit{SystemV IPC} è quello della memoria +condivisa. %%% Local Variables: %%% mode: latex