X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=4a9090e4299858e38b95f0fd85f296aff8f1bfc2;hp=be507a5b1c3b9fe4828e1f95977b76eeffed730e;hb=c46df2fabf1fd8946892f9adf0771831a5c0f796;hpb=d78bf87e6d67988bd75cb18f8e74a8f4dcaaf710 diff --git a/ipc.tex b/ipc.tex index be507a5..4a9090e 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1,6 +1,6 @@ %% ipc.tex %% -%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2013 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -74,6 +74,9 @@ illustrato in fig.~\ref{fig:ipc_pipe_singular}, in cui sono illustrati i due capi della pipe, associati a ciascun file descriptor, con le frecce che indicano la direzione del flusso dei dati. +% TODO: la dimensione è cambiata a 64k (vedi man 7 pipe) e può essere +% modificata con F_SETPIPE_SZ dal 2.6.35 (vedi fcntl) + \begin{figure}[!htb] \centering \includegraphics[height=5cm]{img/pipe} @@ -82,7 +85,7 @@ indicano la direzione del flusso dei dati. \end{figure} Chiaramente creare una pipe all'interno di un singolo processo non serve a -niente; se però ricordiamo quanto esposto in sez.~\ref{sec:file_sharing} +niente; se però ricordiamo quanto esposto in sez.~\ref{sec:file_shared_access} 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, @@ -184,11 +187,10 @@ Il programma ci servirà anche come esempio dell'uso delle funzioni di duplicazione dei file descriptor che abbiamo trattato in sez.~\ref{sec:file_dup}, in particolare di \func{dup2}. È attraverso queste funzioni infatti che è possibile dirottare gli stream standard dei processi -(che abbiamo visto in sez.~\ref{sec:file_std_descr} e -sez.~\ref{sec:file_std_stream}) sulla pipe. In -fig.~\ref{fig:ipc_barcodepage_code} abbiamo riportato il corpo del programma, -il cui codice completo è disponibile nel file \file{BarCodePage.c} che si -trova nella directory dei sorgenti. +(che abbiamo visto in tab.~\ref{tab:file_std_files} e +sez.~\ref{sec:file_stream}) sulla pipe. In fig.~\ref{fig:ipc_barcodepage_code} +abbiamo riportato il corpo del programma, il cui codice completo è disponibile +nel file \file{BarCodePage.c} che si trova nella directory dei sorgenti. \begin{figure}[!htbp] \footnotesize \centering @@ -302,9 +304,9 @@ che sarà aperto in sola lettura (e quindi associato allo standard output del programma indicato) in caso si sia indicato \code{"r"}, o in sola scrittura (e quindi associato allo standard input) in caso di \code{"w"}. -Lo stream restituito da \func{popen} è identico a tutti gli effetti ai file -stream visti in cap.~\ref{cha:files_std_interface}, anche se è collegato ad -una pipe e non ad un file, e viene sempre aperto in modalità +Lo \textit{stream} restituito da \func{popen} è identico a tutti gli effetti +ai \textit{file stream} visti in sez.~\ref{sec:files_std_interface}, anche se +è collegato ad una pipe e non ad un file, e viene sempre aperto in modalità \textit{fully-buffered} (vedi sez.~\ref{sec:file_buffering}); l'unica differenza con gli usuali stream è che dovrà essere chiuso dalla seconda delle due nuove funzioni, \funcd{pclose}, il cui prototipo è: @@ -431,7 +433,7 @@ quello illustrato per le pipe in sez.~\ref{sec:ipc_pipes}. Abbiamo già visto in sez.~\ref{sec:file_mknod} le funzioni \func{mknod} e \func{mkfifo} che permettono di creare una fifo; per utilizzarne una un -processo non avrà che da aprire il relativo \index{file!speciale} file +processo non avrà che da aprire il relativo \index{file!speciali} file speciale o in lettura o scrittura; nel primo caso sarà collegato al capo di uscita della fifo, e dovrà leggere, nel secondo al capo di ingresso, e dovrà scrivere. @@ -511,7 +513,7 @@ un detto a caso estratto da un insieme di frasi; sia il numero delle frasi dell'insieme, che i file da cui esse vengono lette all'avvio, sono importabili da riga di comando. Il corpo principale del server è riportato in fig.~\ref{fig:ipc_fifo_server}, dove si è tralasciata la parte che tratta la -gestione delle opzioni a riga di comando, che effettua il settaggio delle +gestione delle opzioni a riga di comando, che effettua l'impostazione delle variabili \var{fortunefilename}, che indica il file da cui leggere le frasi, ed \var{n}, che indica il numero di frasi tenute in memoria, ad un valore diverso da quelli preimpostati. Il codice completo è nel file @@ -2065,6 +2067,10 @@ vengono effettuate con la funzione \funcd{semop}, il cui prototipo è: } \end{functions} + +%TODO manca semtimedop, trattare qui, referenziata in +%sez.~\ref{sec:sig_gen_beha}. + La funzione permette di eseguire operazioni multiple sui singoli semafori di un insieme. La funzione richiede come primo argomento l'identificatore \param{semid} dell'insieme su cui si vuole operare. Il numero di operazioni da @@ -2363,6 +2369,8 @@ ripeteremo quanto detto al proposito in sez.~\ref{sec:ipc_sysv_mq}. L'argomento \param{size} specifica invece la dimensione, in byte, del segmento, che viene comunque arrotondata al multiplo superiore di \const{PAGE\_SIZE}. +% TODO aggiungere l'uso di SHM_HUGETLB introdotto con il kernel 2.6.0 + La memoria condivisa è la forma più veloce di comunicazione fra due processi, in quanto permette agli stessi di vedere nel loro spazio di indirizzi una stessa sezione di memoria. Pertanto non è necessaria nessuna operazione di @@ -3053,7 +3061,7 @@ La prima possibilità, utilizzata fin dalle origini di Unix, è quella di usare dei \textsl{file di lock} (per i quali esiste anche una opportuna directory, \file{/var/lock}, nel filesystem standard). Per questo si usa la caratteristica della funzione \func{open} (illustrata in -sez.~\ref{sec:file_open}) che prevede\footnote{questo è quanto dettato dallo +sez.~\ref{sec:file_open_close}) che prevede\footnote{questo è quanto dettato dallo standard POSIX.1, ciò non toglie che in alcune implementazioni questa tecnica possa non funzionare; in particolare per Linux, nel caso di NFS, si è comunque soggetti alla possibilità di una \itindex{race~condition} @@ -3085,7 +3093,7 @@ cancella con \func{unlink}. \end{figure} Uno dei limiti di questa tecnica è che, come abbiamo già accennato in -sez.~\ref{sec:file_open}, questo comportamento di \func{open} può non +sez.~\ref{sec:file_open_close}, questo comportamento di \func{open} può non funzionare (la funzione viene eseguita, ma non è garantita l'atomicità dell'operazione) se il filesystem su cui si va ad operare è su NFS; in tal caso si può adottare una tecnica alternativa che prevede l'uso della @@ -3255,7 +3263,12 @@ più avanti, quando realizzeremo una nuova versione del monitor visto in sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete. \itindend{memory~mapping} -% TODO fare esempio di mmap anonima +% TODO: fare esempio di mmap anonima + +% TODO: con il kernel 3.2 è stata introdotta un nuovo meccanismo di +% intercomunicazione veloce chiamato Cross Memory Attach, da capire se e come +% trattarlo qui, vedi http://lwn.net/Articles/405346/ +% https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=fcf634098c00dd9cd247447368495f0b79be12d1 \section{L'intercomunicazione fra processi di POSIX} \label{sec:ipc_posix} @@ -3414,7 +3427,7 @@ diversi. La funzione è del tutto analoga ad \func{open} ed analoghi sono i valori che possono essere specificati per \param{oflag}, che deve essere specificato come maschera binaria; i valori possibili per i vari bit sono quelli visti in -tab.~\ref{tab:file_open_flags} dei quali però \func{mq\_open} riconosce solo i +sez.~\ref{sec:file_open_close} dei quali però \func{mq\_open} riconosce solo i seguenti: \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}} \item[\const{O\_RDONLY}] Apre la coda solo per la ricezione di messaggi. Il @@ -3844,7 +3857,7 @@ La funzione è del tutto analoga ad \func{open} ed analoghi sono i valori che possono essere specificati per \param{oflag}, che deve essere specificato come maschera binaria comprendente almeno uno dei due valori \const{O\_RDONLY} e \const{O\_RDWR}; i valori possibili per i vari bit sono quelli visti in -tab.~\ref{tab:file_open_flags} dei quali però \func{shm\_open} riconosce solo +sez.~\ref{sec:file_open_close} dei quali però \func{shm\_open} riconosce solo i seguenti: \begin{basedescript}{\desclabelwidth{2.0cm}\desclabelstyle{\nextlinelabel}} \item[\const{O\_RDONLY}] Apre il file descriptor associato al segmento di @@ -3866,7 +3879,7 @@ In caso di successo la funzione restituisce un file descriptor associato al segmento di memoria condiviso con le stesse modalità di \func{open}\footnote{in realtà, come accennato, \func{shm\_open} è un semplice wrapper per \func{open}, usare direttamente quest'ultima avrebbe lo stesso - effetto.} viste in sez.~\ref{sec:file_open}; in particolare viene impostato + effetto.} viste in sez.~\ref{sec:file_open_close}; in particolare viene impostato il flag \const{FD\_CLOEXEC}. Chiamate effettuate da diversi processi usando lo stesso nome, restituiranno file descriptor associati allo stesso segmento (così come, nel caso di file di dati, essi sono associati allo stesso @@ -4032,7 +4045,7 @@ automaticamente un nome nella forma \texttt{sem.qualchenome}.\footnote{si ha L'argomento \param{oflag} è quello che controlla le modalità con cui opera la funzione, ed è passato come maschera binaria; i bit corrispondono a quelli utilizzati per l'analogo argomento di \func{open}, anche se dei possibili -valori visti in sez.~\ref{sec:file_open} sono utilizzati soltanto +valori visti in sez.~\ref{sec:file_open_close} sono utilizzati soltanto \const{O\_CREAT} e \const{O\_EXCL}. Se si usa \const{O\_CREAT} si richiede la creazione del semaforo qualora