X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=ipc.tex;h=9e7e459e08ff4c2a508eb2c8d6ff4e2fc3266926;hp=bc8d542641a3fb6b7987dcb706cfc2c38b3853f2;hb=39988e227717a974a2080916d0aef341088ae35c;hpb=e91584927c1db3e0b5d08facab44c76b197c101d diff --git a/ipc.tex b/ipc.tex index bc8d542..9e7e459 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1,6 +1,6 @@ %% ipc.tex %% -%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2019 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", @@ -96,7 +96,7 @@ con le frecce che indicano la direzione del flusso dei dati. \end{figure} Della funzione di sistema esiste una seconda versione, \funcd{pipe2}, -introdotta con il kernel 2.6.27 e le \acr{glibc} 2.9 e specifica di Linux +introdotta con il kernel 2.6.27 e la \acr{glibc} 2.9 e specifica di Linux (utilizzabile solo definendo la macro \macro{\_GNU\_SOURCE}), che consente di impostare atomicamente le caratteristiche dei file descriptor restituiti, il suo prototipo è: @@ -221,9 +221,9 @@ Per realizzare quanto voluto useremo in sequenza i programmi \cmd{barcode} e \cmd{gs}, il primo infatti è in grado di generare immagini PostScript di codici a barre corrispondenti ad una qualunque stringa, mentre il secondo serve per poter effettuare la conversione della stessa immagine in formato -JPEG. Usando una \textit{pipe} potremo inviare l'output del primo sull'input del -secondo, secondo lo schema mostrato in fig.~\ref{fig:ipc_pipe_use}, in cui la -direzione del flusso dei dati è data dalle frecce continue. +JPEG. Usando una \textit{pipe} potremo inviare l'output del primo sull'input +del secondo, secondo lo schema mostrato in fig.~\ref{fig:ipc_pipe_use}, in cui +la direzione del flusso dei dati è data dalle frecce continue. Si potrebbe obiettare che sarebbe molto più semplice salvare il risultato intermedio su un file temporaneo. Questo però non tiene conto del fatto che un @@ -366,11 +366,10 @@ La funzione restituisce il puntatore ad uno stream associato alla \textit{pipe} creata, che sarà aperto in sola lettura (e quindi associato allo \textit{standard output} del programma indicato) in caso si sia indicato \code{r}, o in sola scrittura (e quindi associato allo \textit{standard - input}) in caso di \code{w}. A partire dalla versione 2.9 delle \acr{glibc} + input}) in caso di \code{w}. A partire dalla versione 2.9 della \acr{glibc} (questa è una estensione specifica di Linux) all'argomento \param{type} può essere aggiunta la lettera ``\texttt{e}'' per impostare automaticamente il -flag di \textit{close-on-exec} sul file descriptor sottostante (si ricordi -quanto spiegato in sez.~\ref{sec:file_open_close}). +flag di \textit{close-on-exec} sul file descriptor sottostante. 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 @@ -648,7 +647,7 @@ due volte, prima in lettura e poi in scrittura, per evitare di dover gestire all'interno del ciclo principale il caso in cui il server è in ascolto ma non ci sono client che effettuano richieste. Si ricordi infatti che quando una \textit{fifo} è aperta solo dal capo in lettura, l'esecuzione di \func{read} -ritorna con zero byte (si ha cioè una condizione di end-of-file). +ritorna con zero byte (si ha cioè una condizione di \textit{end-of-file}). Nel nostro caso la prima apertura si bloccherà fintanto che un qualunque client non apre a sua volta la \textit{fifo} nota in scrittura per effettuare @@ -1072,8 +1071,8 @@ Il secondo livello di controllo è quello delle varie funzioni che accedono direttamente (in lettura o scrittura) all'oggetto. In tal caso lo schema dei controlli è simile a quello dei file, ed avviene secondo questa sequenza: \begin{itemize*} -\item se il processo ha i privilegi di amministratore (più precisamente la - capacità \const{CAP\_IPC\_OWNER}) l'accesso è sempre consentito. +\item se il processo ha i privilegi di amministratore (più precisamente + \const{CAP\_IPC\_OWNER}) l'accesso è sempre consentito. \item se l'\ids{UID} effettivo del processo corrisponde o al valore del campo \var{cuid} o a quello del campo \var{uid} ed il permesso per il proprietario in \var{mode} è appropriato\footnote{per appropriato si intende che è @@ -1362,7 +1361,7 @@ come \ctyp{short}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{.90\textwidth} + \begin{minipage}[c]{.91\textwidth} \includestruct{listati/msqid_ds.h} \end{minipage} \normalsize @@ -1397,7 +1396,7 @@ riguarda gli altri campi invece: % primo e ultimo messaggio sono inizializzati a \val{NULL} e % \var{msg\_cbytes}, che esprime la dimensione in byte dei messaggi presenti è % inizializzato a zero. Questi campi sono ad uso interno dell'implementazione -% e non devono essere utilizzati da programmi in user space). +% e non devono essere utilizzati da programmi in \textit{user space}). \end{itemize*} Una volta creata una coda di messaggi le operazioni di controllo vengono @@ -1945,7 +1944,7 @@ processo, e la gestione diventa più complicata. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{.80\textwidth} + \begin{minipage}[c]{.85\textwidth} \includestruct{listati/semid_ds.h} \end{minipage} \normalsize @@ -1975,7 +1974,7 @@ quanto riguarda gli altri campi invece: \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{.80\textwidth} + \begin{minipage}[c]{.85\textwidth} \includestruct{listati/sem.h} \end{minipage} \normalsize @@ -2095,10 +2094,10 @@ unificare detto argomento esso deve essere passato come una unione \struct{semun}, la cui definizione, con i possibili valori che può assumere, è riportata in fig.~\ref{fig:ipc_semun}. -Nelle versioni più vecchie delle \acr{glibc} questa unione veniva definita in +Nelle versioni più vecchie della \acr{glibc} questa unione veniva definita in \file{sys/sem.h}, ma nelle versioni più recenti questo non avviene più in quanto lo standard POSIX.1-2001 richiede che sia sempre definita a cura del -chiamante. In questa seconda evenienza le \acr{glibc} definiscono però la +chiamante. In questa seconda evenienza la \acr{glibc} definisce però la macro \macrod{\_SEM\_SEMUN\_UNDEFINED} che può essere usata per controllare la situazione. @@ -2140,7 +2139,7 @@ i seguenti: \param{semnum} dell'insieme \param{semid} (corrispondente al campo \var{sempid} di \struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di lettura. -\item[\constd{GETVAL}] Restituisce come valore di ritorno della funzione il il +\item[\constd{GETVAL}] Restituisce come valore di ritorno della funzione il valore corrente del semaforo \param{semnum} dell'insieme \param{semid} (corrispondente al campo \var{semval} di \struct{sem}). Va invocata con tre argomenti. Occorre avere il permesso di lettura. @@ -2243,7 +2242,7 @@ vettore \param{sops}. Con lo standard POSIX.1-2001 è stata introdotta una variante di \func{semop} che consente di specificare anche un tempo massimo di attesa. La nuova -funzione di sistema, disponibile a partire dal kernel 2.4.22 e dalle +funzione di sistema, disponibile a partire dal kernel 2.4.22 e dalla \acr{glibc} 2.3.3, ed utilizzabile solo dopo aver definito la macro \macro{\_GNU\_SOURCE}, è \funcd{semtimedop}, ed il suo prototipo è: @@ -2304,7 +2303,7 @@ un valore nullo di \var{sem\_num}. Il campo \var{sem\_flg} è un flag, mantenuto come maschera binaria, per il quale possono essere impostati i due valori \const{IPC\_NOWAIT} e -\constd{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa si che in tutti quei +\constd{SEM\_UNDO}. Impostando \const{IPC\_NOWAIT} si fa sì che in tutti quei casi in cui l'esecuzione di una operazione richiederebbe di porre il processo vada nello stato di \textit{sleep}, invece di bloccarsi \func{semop} ritorni immediatamente (abortendo così le eventuali operazioni restanti) con un errore @@ -2427,7 +2426,7 @@ struttura \struct{sembuf}) e al processo corrente (nel campo \var{sleeper}) poi quest'ultimo viene messo stato di attesa e viene invocato lo \textit{scheduler} per passare all'esecuzione di un altro processo. -Se invece tutte le operazioni possono avere successo queste vengono eseguite +Se invece tutte le operazioni possono avere successo vengono eseguite immediatamente, dopo di che il kernel esegue una scansione della coda di attesa (a partire da \var{sem\_pending}) per verificare se qualcuna delle operazioni sospese in precedenza può essere eseguita, nel qual caso la @@ -2780,10 +2779,9 @@ si ha a cuore la portabilità. Questi comandi aggiuntivi sono: salvata su disco dal meccanismo della memoria virtuale. Come illustrato in sez.~\ref{sec:proc_mem_lock} fino al kernel 2.6.9 solo l'amministratore poteva utilizzare questa capacità,\footnote{che richiedeva la - \textit{capability} \const{CAP\_IPC\_LOCK}.} a partire dal dal kernel - 2.6.10 anche gli utenti normali possono farlo fino al limite massimo - determinato da \const{RLIMIT\_MEMLOCK} (vedi - sez.~\ref{sec:sys_resource_limit}). + \textit{capability} \const{CAP\_IPC\_LOCK}.} a partire dal kernel 2.6.10 + anche gli utenti normali possono farlo fino al limite massimo determinato da + \const{RLIMIT\_MEMLOCK} (vedi sez.~\ref{sec:sys_resource_limit}). \item[\constd{SHM\_UNLOCK}] Disabilita il \textit{memory locking} sul segmento di memoria condivisa. Fino al kernel 2.6.9 solo l'amministratore poteva utilizzare questo comando in corrispondenza di un segmento da lui bloccato. @@ -2849,8 +2847,8 @@ stato marcato per la cancellazione. L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{lo standard SVID prevede che l'argomento \param{shmaddr} sia di tipo \ctyp{char *}, così - come il valore di ritorno della funzione; in Linux è stato così con le - \acr{libc4} e le \acr{libc5}, con il passaggio alla \acr{glibc} il tipo di + come il valore di ritorno della funzione; in Linux è stato così con la + \acr{libc4} e la \acr{libc5}, con il passaggio alla \acr{glibc} il tipo di \param{shmaddr} è divenuto un \ctyp{const void *} e quello del valore di ritorno un \ctyp{void *} seguendo POSIX.1-2001.} deve essere associato il segmento, se il valore specificato è \val{NULL} è il sistema a scegliere @@ -2869,9 +2867,9 @@ riferiti all'indirizzo di partenza del segmento). L'argomento \param{shmflg} permette di cambiare il comportamento della funzione; esso va specificato come maschera binaria, i bit utilizzati al -momento sono sono tre e sono identificati dalle costanti \const{SHM\_RND}, +momento sono tre e sono identificati dalle costanti \const{SHM\_RND}, \const{SHM\_RDONLY} e \const{SHM\_REMAP} che vanno combinate con un OR -aritmetico. +aritmetico. Specificando \constd{SHM\_RND} si evita che \func{shmat} ritorni un errore quando \param{shmaddr} non è allineato ai confini di una pagina. Si può quindi @@ -3554,6 +3552,8 @@ sez.~\ref{sec:ipc_sysv_shm} che possa restituisca i risultati via rete. % TODO: con il kernel 3.17 è stata introdotta una fuunzionalità di % sigillatura dei file mappati in memoria e la system call memfd % (capire se va messo qui o altrove) vedi: http://lwn.net/Articles/593918/ +% col 5.1 aggiunta a memfd F_SEAL_FUTURE_WRITE, vedi +% https://git.kernel.org/linus/ab3948f58ff8 e https://lwn.net/Articles/782511/ \section{L'intercomunicazione fra processi di POSIX} @@ -3778,9 +3778,9 @@ dei rispettivi limiti di sistema altrimenti la funzione fallirà con un errore di \errcode{EINVAL}. Se \param{attr} è un puntatore nullo gli attributi della coda saranno impostati ai valori predefiniti. -I suddetti limiti di sistema sono impostati attraverso altrettanti file in -\texttt{/proc/sys/fs/mqueue}, in particolare i file che controllano i valori -dei limiti sono: +I suddetti limiti di sistema sono impostati attraverso una serie di file +presenti sotto \texttt{/proc/sys/fs/mqueue}, in particolare i file che +controllano i valori dei limiti sono: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} \item[\sysctlfiled{fs/mqueue/msg\_max}] Indica il valore massimo del numero di messaggi in una coda e agisce come limite superiore per il valore di @@ -3833,7 +3833,7 @@ descrittore con la funzione \funcd{mq\_close}, il cui prototipo è: La funzione è analoga a \func{close},\footnote{su Linux, dove le code sono implementate come file su un filesystem dedicato, è esattamente la stessa funzione, per cui non esiste una \textit{system call} autonoma e la funzione - viene rimappata su \func{close} dalle \acr{glibc}.} dopo la sua esecuzione + viene rimappata su \func{close} dalla \acr{glibc}.} dopo la sua esecuzione il processo non sarà più in grado di usare il descrittore della coda, ma quest'ultima continuerà ad esistere nel sistema e potrà essere acceduta con un'altra chiamata a \func{mq\_open}. All'uscita di un processo tutte le code @@ -3968,8 +3968,8 @@ nell'argomento \param{msg\_ptr}, e la relativa lunghezza in \param{msg\_len}. Se quest'ultima eccede la dimensione massima specificata da \var{mq\_msgsize} le funzioni ritornano immediatamente con un errore di \errcode{EMSGSIZE}. -L'argomento \param{msg\_prio} indica la priorità dell'argomento, che, essendo -definito come \ctyp{unsigned int}, è sempre un intero positivo. I messaggi di +L'argomento \param{msg\_prio} indica la priorità dell'argomento che essendo +definito come \ctyp{unsigned int} è sempre un intero positivo. I messaggi di priorità maggiore vengono inseriti davanti a quelli di priorità inferiore, e quindi saranno riletti per primi. A parità del valore della priorità il messaggio sarà inserito in coda a tutti quelli che hanno la stessa priorità @@ -4399,9 +4399,9 @@ sincronizzazione completamente nuovo, basato sui cosiddetti \textit{futex} (la sigla sta per \textit{fast user mode mutex}) con il quale è stato possibile implementare una versione nativa dei semafori POSIX. Grazie a questo con i kernel della serie 2.6 e le nuove versioni della \acr{glibc} che usano questa -nuova infrastruttura per quella che viene che viene chiamata \textit{New Posix - Thread Library}, sono state implementate anche tutte le funzioni -dell'interfaccia dei semafori POSIX. +nuova infrastruttura per quella che viene chiamata \textit{New Posix Thread + Library}, sono state implementate anche tutte le funzioni dell'interfaccia +dei semafori POSIX. Anche in questo caso è necessario appoggiarsi alla libreria per le estensioni \textit{real-time} \texttt{librt}, questo significa che se si vuole utilizzare @@ -4963,11 +4963,11 @@ quindi bloccato (causando a questo punto una interruzione delle stampe eseguite da \file{message\_getter}). Terminato il tempo di attesa si rilascerà (\texttt{\small 29-32}) il semaforo per poi uscire. -Per verificare il funzionamento dei programmi occorrerà lanciare per primo -\file{message\_getter}\footnote{lanciare per primo \file{message\_setter} darà - luogo ad un errore, non essendo stati creati il semaforo ed il segmento di - memoria condivisa.} che inizierà a stampare una volta al secondo il -contenuto del messaggio ed i suoi dati, con qualcosa del tipo: +Per verificare il funzionamento dei programmi occorrerà lanciare prima +\file{message\_getter} (lanciare per primo \file{message\_setter} darebbe +luogo ad un errore, non essendo stati creati il semaforo ed il segmento di +memoria condivisa) che inizierà a stampare una volta al secondo il contenuto +del messaggio ed i suoi dati, con qualcosa del tipo: \begin{Console} piccardi@hain:~/gapil/sources$ \textbf{./message_getter messaggio} sem=1, Fri Dec 31 14:12:41 2010 @@ -4990,10 +4990,8 @@ Sleeping for 3 seconds \end{Console} %$ dove il programma si fermerà per 3 secondi prima di rilasciare il semaforo e -terminare. - -L'effetto di questo programma si potrà però apprezzare meglio nell'uscita di -\file{message\_getter}, che verrà interrotta per questo stesso tempo, prima di +terminare. L'effetto di tutto ciò si potrà vedere nell'\textit{output} di +\file{message\_getter}, che verrà interrotto per questo stesso tempo, prima di ricominciare con il nuovo testo: \begin{Console} ... @@ -5022,6 +5020,17 @@ fig.~\ref{fig:ipc_posix_sem_shm_message_setter}), e riprenderanno con il nuovo testo alla terminazione di quest'ultimo. + +% TODO: trattare i futex (segnalati altrove come sezione xxx_futex), non mi è +% chiaro ancora dove mettere questa parte. Per gli argomenti vedi comunque: +% man futex, https://lwn.net/Articles/360699/, +% https://www.man7.org/linux/man-pages/man7/futex.7.html ed inoltre +% https://lwn.net/Articles/172149/, https://lwn.net/Articles/387246/, +% https://lwn.net/Articles/178253/, https://lwn.net/Articles/823513/, +% https://lwn.net/Articles/655044/ + + + % LocalWords: like fifo System POSIX RPC Calls Common Object Request Brocker % LocalWords: Architecture descriptor kernel unistd int filedes errno EMFILE % LocalWords: ENFILE EFAULT BUF sez fig fork Stevens siblings EOF read SIGPIPE