From: Simone Piccardi Date: Mon, 8 Jul 2002 16:25:15 +0000 (+0000) Subject: Correzioni X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=6c705d16151fa82874be6aced255d346c9d2bd7b;p=gapil.git Correzioni --- diff --git a/ipc.tex b/ipc.tex index cd9c68f..bdbdf2c 100644 --- a/ipc.tex +++ b/ipc.tex @@ -110,6 +110,13 @@ processo ricever restituirà un errore di \macro{EPIPE} (al ritorno del manipolatore, o qualora il segnale sia ignorato o bloccato). +La dimensione del buffer della pipe (\macro{PIPE\_BUF}) ci dà inoltre un'altra +importante informazione riguardo il comportamento delle operazioni di lettura +e scrittura su di una pipe; esse infatti sono atomiche fintanto che la +quantità di dati da scrivere non supera questa dimensione. Qualora ad esempio +si effettui una scrittura di una quantità di dati superiore l'operazione verrà +effettuata in più riprese, consentendo l'intromissione di scritture effettuate +da altri processi. \subsection{Un esempio dell'uso delle pipe} @@ -158,7 +165,7 @@ intermedio su un file temporaneo. Questo per \textit{CGI} deve poter gestire più richieste in concorrenza, e si avrebbe una evidente race condition in caso di accesso simultaneo a detto file.\footnote{il problema potrebbe essere superato determinando in anticipo - un nome appropiato per il file temporaneo, che verrebbe utilizzato dai vari + un nome appropriato per il file temporaneo, che verrebbe utilizzato dai vari sotto-processi, e cancellato alla fine della loro esecuzione; ma a questo le cose non sarebbero più tanto semplici.} L'uso di una pipe invece permette di risolvere il problema in maniera semplice ed elegante. @@ -295,7 +302,7 @@ capo in scrittura della seconda pipe, e attende la conclusione del figlio (\texttt{\small 45}); a questo punto può (\texttt{\small 46}) uscire. Si tenga conto che l'operazione di chiudere il capo in scrittura della seconda pipe è necessaria, infatti, se non venisse chiusa, \cmd{gs}, che legge il suo -stardard input da detta pipe, resterebbe bloccato in attesa di ulteriori dati +standard input da detta pipe, resterebbe bloccato in attesa di ulteriori dati in ingresso (l'unico modo che un programma ha per sapere che l'input è terminato è rilevare che lo standard input è stato chiuso), e la \func{wait} non ritornerebbe. @@ -342,7 +349,7 @@ funzioni, \func{pclose}, il cui prototipo \begin{prototype}{stdio.h} {int pclose(FILE *stream)} -Chiude il file \param{stream}, restituito da una prededente \func{popen} +Chiude il file \param{stream}, restituito da una precedente \func{popen} attendendo la terminazione del processo ad essa associato. \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di @@ -402,7 +409,7 @@ programmi effettivamente eseguiti. Questo non comporta nessun problema dato che la lettura su una pipe è bloccante, per cui ciascun processo, per quanto lanciato per primo, si bloccherà in attesa di ricevere sullo standard input il -risultato dell'elaborazione del precendente, benchè quest'ultimo venga +risultato dell'elaborazione del precedente, benchè quest'ultimo venga invocato dopo. \begin{figure}[!htb] @@ -494,7 +501,7 @@ processo non avr scrittura; nel primo caso sarà collegato al capo di uscita della fifo, e dovrà leggere, nel secondo al capo di ingresso, e dovrà scrivere. -Il kernel crea una sigola pipe per ciascuna fifo che sia stata aperta, che può +Il kernel crea una singola pipe per ciascuna fifo che sia stata aperta, che può essere acceduta contemporaneamente da più processi, sia in lettura che in scrittura. Dato che per funzionare deve essere aperta in entrambe le direzioni, per una fifo di norma la funzione \func{open} si blocca se viene @@ -507,8 +514,8 @@ l'errore di \macro{ENXIO} fintanto che non verr In Linux\footnote{lo standard POSIX lascia indefinito questo comportamento.} è possibile aprire le fifo anche in lettura/scrittura, operazione che avrà -sempre successo qualunque sia la modalità di apertura (bloccante e non -bloccante); questo può essere utilizzato per aprire comunque una fifo in +sempre successo immediato qualunque sia la modalità di apertura (bloccante e +non bloccante); questo può essere utilizzato per aprire comunque una fifo in scrittura anche se non ci sono ancora processi il lettura; è possibile anche usare la fifo all'interno di un solo processo, nel qual caso però occorre stare molto attenti alla possibili deadlock.\footnote{se si cerca di leggere @@ -521,30 +528,35 @@ stare molto attenti alla possibili deadlock.\footnote{se si cerca di leggere \section{La comunicazione fra processi di System V} \label{sec:ipc_sysv} -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 interfacce 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}. +Benché le pipe (e le fifo) siano ancora ampiamente usate, esse presentano +numerosi limiti, il principale dei quali è che il meccanismo di comunicazione +è rigidamente sequenziale; una situazione in cui un processo scrive qualcosa +che molti altri devono poter leggere non può essere implementata con una pipe. + +Per superarne i vari limiti, nello sviluppo di System V vennero introdotti una +serie di nuovi oggetti di comunicazione e relative interfacce id +programmazione che garantissero una maggiore flessibilità; in questa sezione +esamineremo quello che viene ormai chiamato il \textsl{Sistema di + comunicazione inter-processo} di System V , più comunemente noto come +\textit{System V IPC (Inter-Process Comunication)}. \subsection{Code di messaggi} \label{sec:ipc_messque} -Il primo oggetto introdotto dal \textit{SystemV IPC} è quello delle code di +Il primo oggetto introdotto dal \textit{System V IPC} è quello delle code di messaggi. \subsection{Semafori} \label{sec:ipc_semaph} -Il secondo oggetto introdotto dal \textit{SystemV IPC} è quello dei semafori. +Il secondo oggetto introdotto dal \textit{System V IPC} è quello dei semafori. \subsection{Memoria condivisa} \label{sec:ipc_shar_mem} -Il terzo oggetto introdotto dal \textit{SystemV IPC} è quello della memoria +Il terzo oggetto introdotto dal \textit{System V IPC} è quello della memoria condivisa. %%% Local Variables: