X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=bb175495677ccd7c52a83b7db0ac7eac36b3f00e;hp=6c1041ef5271eadb33f5027e1b0fd98d9080868d;hb=a0fdff527cf9690c0d16c48182bda2865b79f501;hpb=525464ecdd7e6cbdccc733e73b5f1cc9dbe6022a diff --git a/ipc.tex b/ipc.tex index 6c1041e..bb17549 100644 --- a/ipc.tex +++ b/ipc.tex @@ -3,16 +3,17 @@ Uno degli aspetti fondamentali della programmazione in un sistema unix-like è -la comunicazione fra processi. In questo capitolo affronteremo solo alcuni dei +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. -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. Inoltre tratteremo nei -capitoli successivi tutta la problematica relativa alla comunicazione -attraverso la rete. +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. @@ -27,18 +28,60 @@ 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, e più -comunemente usato, meccanismo di comunicazione fra processi. Esse sono un file -speciale 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 immette dati che arriveranno -all'altro. +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. + + +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. Il +concetto di funzionamento di una \textit{pipe} è relativamente semplice, +quello che si scrive nel file descriptor aperto in scrittura viene +ripresentato tale e quale nel file descriptor aperto in lettura, da cui può +essere riletto. + +I file descriptor infatti non sono connessi a nessun file reale, ma ad un +buffer nel kernel (la cui dimensione è specificata dalla costante +\macro{PIPE\_BUF}, vedi \secref{sec:sys_file_limits}), di modo che scrivendo +in uno si può rileggere dall'altro. + +Chiaramente creare una pipe all'interno di un processo non serve a niente; se +però ricordiamo quanto esposto in \secref{sec:file_sharing} riguardo al +comportamento dei file descriptor nei processi figli, è immediato capire come +una pipe possa diventare un meccanismo di intercomunicazione. Un processo +figlio infatti condivide gli stessi file descriptor del padre, compresi quelli +associati ad una pipe; in questo modo se uno dei processi scrive su un capo +della pipe, l'altro può leggere. + +Tutto ciò ci mosta come sia immediato realizzare un meccanismo di +comunicazione fra processi attraverso una pipe utilizzando le ordinarie +proprietà dei file, ma ci mostra anche qual'è 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}.} limite nell'uso delle \textit{pipe}. È +necessario infatti che i processi possano condividere i file descriptor della +\textit{pipe}, e per questo essi devono comunque derivare da uno stesso +processo padre che ha aperto la pipe, o, più comunemente, essere nella +relazione padre/figlio. + + -Perché questo accada però, e questo è il principale 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. @@ -53,22 +96,23 @@ 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 ai 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 -\textit{System V Inter Process Comunication system}, più comunemente noto come -\textit{SystemV IPC}. +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. +messaggi. \subsection{Semafori} \label{sec:ipc_semaph}