From 6760429dc70f868716393c4413c5450b0649869b Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Wed, 15 Jul 2015 18:08:46 +0000 Subject: [PATCH 1/1] Reindicizzazioni, si prosegue. --- fileadv.tex | 6 +++--- filedir.tex | 11 +++++----- fileio.tex | 58 +++++++++++++++++++++++++--------------------------- ipc.tex | 30 +++++++++++++-------------- prochand.tex | 30 +++++++++++++++------------ socket.tex | 8 ++++---- system.tex | 21 +++++++++---------- 7 files changed, 81 insertions(+), 83 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index caab100..e99b81b 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1629,9 +1629,9 @@ come estensione della precedente (è disponibile solo a partire dal kernel di creazione del file descriptor. Al momento l'unico valore legale per \param{flags} (a parte lo zero) è \const{EPOLL\_CLOEXEC}, che consente di impostare in maniera atomica sul file descriptor il flag di -\itindex{close-on-exec} \textit{close-on-exec} (si è trattato il significato -di \const{O\_CLOEXEC} in sez.~\ref{sec:file_open_close}), senza che sia -necessaria una successiva chiamata a \func{fcntl}. +\textit{close-on-exec} (si è trattato il significato di \const{O\_CLOEXEC} in +sez.~\ref{sec:file_open_close}), senza che sia necessaria una successiva +chiamata a \func{fcntl}. Una volta ottenuto un file descriptor per \textit{epoll} il passo successivo è indicare quali file descriptor mettere sotto osservazione e quali operazioni diff --git a/filedir.tex b/filedir.tex index 4e3e4bb..df4576e 100644 --- a/filedir.tex +++ b/filedir.tex @@ -2025,9 +2025,9 @@ directory. Si tenga presente che comunque la funzione opera associando il \textit{directory stream} ad un opportuno file descriptor sottostante, sul quale vengono compiute le operazioni. Questo viene sempre aperto impostando il -flag di \itindex{close-on-exec} \textit{close-on-exec} (si ricordi quanto -detto in sez.~\ref{sec:proc_exec}), così da evitare che resti aperto in caso -di esecuzione di un altro programma. +flag di \textit{close-on-exec} (si ricordi quanto detto in +sez.~\ref{sec:proc_exec}), così da evitare che resti aperto in caso di +esecuzione di un altro programma. Nel caso in cui sia necessario conoscere il \textit{file descriptor} associato ad un \textit{directory stream} si può usare la funzione @@ -2098,9 +2098,8 @@ funzioni che operano sul \textit{directory stream} e non dovrà essere più utilizzato all'interno del proprio programma. In particolare dovrà essere chiuso attraverso il \textit{directory stream} con \func{closedir} e non direttamente. Si tenga presente inoltre che \func{fdopendir} non modifica lo -stato di un eventuale flag di \itindex{close-on-exec} \textit{close-on-exec}, -che pertanto dovrà essere impostato esplicitamente in fase di apertura del -file descriptor. +stato di un eventuale flag di \textit{close-on-exec}, che pertanto dovrà +essere impostato esplicitamente in fase di apertura del file descriptor. Una volta che si sia aperto un \textit{directory stream} la lettura del contenuto della directory viene effettuata attraverso la funzione diff --git a/fileio.tex b/fileio.tex index 3d85526..f23053d 100644 --- a/fileio.tex +++ b/fileio.tex @@ -514,8 +514,7 @@ si tronca il file con \const{O\_TRUNC} verranno impostati soltanto il in fase di apertura del file, deve invece essere attivato successivamente con \func{fcntl}.\\ - \const{O\_CLOEXEC}& Attiva la modalità di \itindex{close-on-exec} - \textit{close-on-exec} (vedi + \const{O\_CLOEXEC}& Attiva la modalità di \textit{close-on-exec} (vedi sez.~\ref{sec:proc_exec}) sul file. Il flag è previsto dallo standard POSIX.1-2008, ed è stato introdotto con il kernel 2.6.23 per evitare una @@ -1307,10 +1306,9 @@ che quello che viene modificato è lo stesso campo nella voce della L'unica differenza fra due file descriptor duplicati è che ciascuno avrà un suo \textit{file descriptor flag} indipendente. A questo proposito deve essere tenuto presente che nel caso in cui si usi \func{dup} per duplicare un file -descriptor, se questo ha il flag di \textit{close-on-exec} -\itindex{close-on-exec} attivo (vedi sez.~\ref{sec:proc_exec} e -sez.~\ref{sec:file_fcntl_ioctl}), questo verrà cancellato nel file descriptor -restituito come copia. +descriptor, se questo ha il flag di \textit{close-on-exec} attivo (vedi +sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}), questo verrà +cancellato nel file descriptor restituito come copia. L'uso principale di questa funzione è nella shell per la redirezione dei file standard di tab.~\ref{tab:file_std_files} fra l'esecuzione di una \func{fork} @@ -1420,11 +1418,10 @@ un file descriptor reimpostandone i flag, per usarla occorre definire la macro \end{funcproto} La funzione è identica a \func{dup2} ma prevede la possibilità di mantenere il -flag di \textit{close-on-exec} \itindex{close-on-exec} sul nuovo -file descriptor specificando \const{O\_CLOEXEC} in \param{flags} (che è l'unico -flag usabile in questo caso). Inoltre rileva esplicitamente la possibile -coincidenza fra \param{newfd} e \param{oldfd}, fallendo con un errore di -\errval{EINVAL}. +flag di \textit{close-on-exec} sul nuovo file descriptor specificando +\const{O\_CLOEXEC} in \param{flags} (che è l'unico flag usabile in questo +caso). Inoltre rileva esplicitamente la possibile coincidenza +fra \param{newfd} e \param{oldfd}, fallendo con un errore di \errval{EINVAL}. \subsection{Le funzioni di sincronizzazione dei dati} @@ -1938,9 +1935,11 @@ il nome indicato nel precedente prototipo), è riportata di seguito: o \errcode{EMFILE} se il processo ha già raggiunto il massimo numero di descrittori consentito. +\itindbeg{close-on-exec} + \item[\const{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma - in più attiva il flag di \itindex{close-on-exec} \textit{close-on-exec} sul - file descriptor duplicato, in modo da evitare una successiva chiamata con + in più attiva il flag di \textit{close-on-exec} sul file descriptor + duplicato, in modo da evitare una successiva chiamata con \const{F\_SETFD}. La funzionalità è stata introdotta con il kernel 2.6.24 ed è prevista nello standard POSIX.1-2008 (si deve perciò definire \macro{\_POSIX\_C\_SOURCE} ad un valore adeguato secondo quanto visto in @@ -1950,20 +1949,21 @@ il nome indicato nel precedente prototipo), è riportata di seguito: flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Al momento l'unico flag usato è quello di - \itindex{close-on-exec} \textit{close-on-exec}, identificato dalla costante - \const{FD\_CLOEXEC}, che serve a richiedere che il file venga chiuso nella - esecuzione di una \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore - nullo significa pertanto che il flag non è impostato. + \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, che + serve a richiedere che il file venga chiuso nella esecuzione di una + \func{exec} (vedi sez.~\ref{sec:proc_exec}). Un valore nullo significa + pertanto che il flag non è impostato. \item[\const{F\_SETFD}] imposta il valore dei \textit{file descriptor flags} al valore specificato con \param{arg}, ritorna un valore nullo in caso di successo e $-1$ in caso di errore. Non sono previsti errori diversi da \errval{EBADF}. Dato che l'unico flag attualmente usato è quello di - \itindex{close-on-exec} \textit{close-on-exec}, identificato dalla costante - \const{FD\_CLOEXEC}, tutti gli altri bit di \param{arg}, anche se impostati, - vengono ignorati.\footnote{questo almeno è quanto avviene fino al kernel - 3.2, come si può evincere dal codice della funzione \texttt{do\_fcntl} nel - file \texttt{fs/fcntl.c} dei sorgenti del kernel.} + \textit{close-on-exec}, identificato dalla costante \const{FD\_CLOEXEC}, + tutti gli altri bit di \param{arg}, anche se impostati, vengono + ignorati.\footnote{questo almeno è quanto avviene fino al kernel 3.2, come + si può evincere dal codice della funzione \texttt{do\_fcntl} nel file + \texttt{fs/fcntl.c} dei sorgenti del kernel.} +\itindend{close-on-exec} \item[\const{F\_GETFL}] ritorna il valore dei \textit{file status flags} di \param{fd} in caso di successo o $-1$ in caso di errore, il terzo argomento @@ -2346,14 +2346,12 @@ sono definite nel kernel a livello generale, e vengono sempre interpretate per prime, per cui, come illustrato in \cite{LinDevDri}, eventuali operazioni specifiche che usino lo stesso valore verrebbero ignorate: \begin{basedescript}{\desclabelwidth{2.0cm}} -\item[\const{FIOCLEX}] imposta il flag di \itindex{close-on-exec} - \textit{close-on-exec} sul file, in questo caso, essendo usata come - operazione logica, \func{ioctl} non richiede un terzo argomento, il cui - eventuale valore viene ignorato. -\item[\const{FIONCLEX}] cancella il flag di \itindex{close-on-exec} - \textit{close-on-exec} sul file, in questo caso, essendo usata come - operazione logica, \func{ioctl} non richiede un terzo argomento, il cui - eventuale valore viene ignorato. +\item[\const{FIOCLEX}] imposta il flag di \textit{close-on-exec} sul file, in + questo caso, essendo usata come operazione logica, \func{ioctl} non richiede + un terzo argomento, il cui eventuale valore viene ignorato. +\item[\const{FIONCLEX}] cancella il flag di \textit{close-on-exec} sul file, + in questo caso, essendo usata come operazione logica, \func{ioctl} non + richiede un terzo argomento, il cui eventuale valore viene ignorato. \item[\const{FIOASYNC}] abilita o disabilita la modalità di I/O asincrono sul file (vedi sez.~\ref{sec:signal_driven_io}); il terzo argomento deve essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) diff --git a/ipc.tex b/ipc.tex index 4ffca7c..f6065cd 100644 --- a/ipc.tex +++ b/ipc.tex @@ -122,7 +122,7 @@ fra \const{O\_NONBLOCK} o \const{O\_CLOEXEC} che hanno l'effetto di impostare su entrambi i file descriptor restituiti dalla funzione i relativi flag, già descritti per \func{open} in tab.~\ref{tab:open_operation_flag}, che attivano rispettivamente la modalità di accesso \textsl{non-bloccante} ed il -\textit{close-on-exec} \itindex{close-on-exec}. +\textit{close-on-exec}. Chiaramente creare una \textit{pipe} all'interno di un singolo processo non serve a niente; se però ricordiamo quanto esposto in @@ -369,8 +369,8 @@ La funzione restituisce il puntatore ad uno stream associato alla input}) in caso di \code{w}. A partire dalla versione 2.9 delle \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} \itindex{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 (si ricordi +quanto spiegato in sez.~\ref{sec:file_open_close}). 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 @@ -1075,8 +1075,7 @@ 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à \itindex{capability} \const{CAP\_IPC\_OWNER}) l'accesso è sempre - consentito. + capacità \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 è @@ -1451,9 +1450,9 @@ per \param{cmd} sono: occorre essere il proprietario o il creatore della coda, oppure l'amministratore e lo stesso vale per \var{msg\_qbytes}. Infine solo l'amministratore (più precisamente un processo con la capacità - \itindex{capability} \const{CAP\_IPC\_RESOURCE}) ha la facoltà di - incrementarne il valore a limiti superiori a \const{MSGMNB}. Se eseguita con - successo la funzione aggiorna anche il campo \var{msg\_ctime}. + \const{CAP\_IPC\_RESOURCE}) ha la facoltà di incrementarne il valore a + limiti superiori a \const{MSGMNB}. Se eseguita con successo la funzione + aggiorna anche il campo \var{msg\_ctime}. \end{basedescript} A questi tre valori, che sono quelli previsti dallo standard, su Linux se ne @@ -2590,8 +2589,8 @@ creazione del segmento usando una \itindex{huge~page} \textit{huge page}, le pagine di memoria di grandi dimensioni introdotte con il kernel 2.6 per ottimizzare le prestazioni nei sistemi più recenti che hanno grandi quantità di memoria. L'operazione è privilegiata e richiede che il processo abbia la -\itindex{capability} \textit{capability} \const{CAP\_IPC\_LOCK}. Questa -funzionalità è specifica di Linux e non è portabile. +\textit{capability} \const{CAP\_IPC\_LOCK}. Questa funzionalità è specifica di +Linux e non è portabile. Il secondo flag aggiuntivo, introdotto a partire dal kernel 2.6.15, è \const{SHM\_NORESERVE}, ed ha lo stesso scopo del flag \const{MAP\_NORESERVE} @@ -3789,9 +3788,8 @@ dei limiti sono: valore massimo è \const{HARD\_MAX} che vale \code{(131072/sizeof(void *))}, ed il valore minimo 1 (ma era 10 per i kernel precedenti il 2.6.28). Questo limite viene ignorato per i processi con privilegi amministrativi (più - precisamente con la \itindex{capability} \textit{capability} - \const{CAP\_SYS\_RESOURCE}) ma \const{HARD\_MAX} resta comunque non - superabile. + precisamente con la \textit{capability} \const{CAP\_SYS\_RESOURCE}) ma + \const{HARD\_MAX} resta comunque non superabile. \item[\sysctlfile{fs/mqueue/msgsize\_max}] Indica il valore massimo della dimensione in byte di un messaggio sulla coda ed agisce come limite @@ -3799,14 +3797,14 @@ dei limiti sono: suo valore di default è 8192. Il valore massimo è 1048576 ed il valore minimo 128 (ma per i kernel precedenti il 2.6.28 detti limiti erano rispettivamente \const{INT\_MAX} e 8192). Questo limite viene ignorato dai - processi con privilegi amministrativi (con la \itindex{capability} - \textit{capability} \const{CAP\_SYS\_RESOURCE}). + processi con privilegi amministrativi (con la \textit{capability} + \const{CAP\_SYS\_RESOURCE}). \item[\sysctlfile{fs/mqueue/queues\_max}] Indica il numero massimo di code di messaggi creabili in totale sul sistema, il valore di default è 256 ma si può usare un valore qualunque fra $0$ e \const{INT\_MAX}. Il limite non viene applicato ai processi con privilegi amministrativi (cioè con la - \itindex{capability} \textit{capability} \const{CAP\_SYS\_RESOURCE}). + \textit{capability} \const{CAP\_SYS\_RESOURCE}). \end{basedescript} diff --git a/prochand.tex b/prochand.tex index 099e98b..cd67422 100644 --- a/prochand.tex +++ b/prochand.tex @@ -599,9 +599,8 @@ Oltre ai file aperti i processi figli ereditano dal padre una serie di altre proprietà; la lista dettagliata delle proprietà che padre e figlio hanno in comune dopo l'esecuzione di una \func{fork} è la seguente: \begin{itemize*} -\item i file aperti e gli eventuali flag di \itindex{close-on-exec} - \textit{close-on-exec} impostati (vedi sez.~\ref{sec:proc_exec} e - sez.~\ref{sec:file_fcntl_ioctl}); +\item i file aperti e gli eventuali flag di \textit{close-on-exec} impostati + (vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}); \item gli identificatori per il controllo di accesso: l'\textsl{user-ID reale}, il \textsl{group-ID reale}, l'\textsl{user-ID effettivo}, il \textsl{group-ID effettivo} ed i \textsl{group-ID supplementari} (vedi @@ -1621,18 +1620,23 @@ nell'esecuzione della funzione \func{exec}, queste sono: localizzazione al valore di default POSIX. \end{itemize*} +\itindbeg{close-on-exec} + La gestione dei file aperti nel passaggio al nuovo programma lanciato con -\func{exec} dipende dal valore che ha il flag di \itindex{close-on-exec} -\textit{close-on-exec} (vedi sez.~\ref{sec:file_fcntl_ioctl}) per ciascun -\textit{file descriptor}. I file per cui è impostato vengono chiusi, tutti gli -altri file restano aperti. Questo significa che il comportamento predefinito è -che i file restano aperti attraverso una \func{exec}, a meno di una chiamata -esplicita a \func{fcntl} che imposti il suddetto flag. Per le directory, lo -standard POSIX.1 richiede che esse vengano chiuse attraverso una \func{exec}, -in genere questo è fatto dalla funzione \func{opendir} (vedi +\func{exec} dipende dal valore che ha il flag di \textit{close-on-exec} (vedi +sez.~\ref{sec:file_fcntl_ioctl}) per ciascun \textit{file descriptor}. I file +per cui è impostato vengono chiusi, tutti gli altri file restano +aperti. Questo significa che il comportamento predefinito è che i file restano +aperti attraverso una \func{exec}, a meno di una chiamata esplicita a +\func{fcntl} che imposti il suddetto flag. Per le directory, lo standard +POSIX.1 richiede che esse vengano chiuse attraverso una \func{exec}, in genere +questo è fatto dalla funzione \func{opendir} (vedi sez.~\ref{sec:file_dir_read}) che effettua da sola l'impostazione del flag di -\itindex{close-on-exec} \textit{close-on-exec} sulle directory che apre, in -maniera trasparente all'utente. +\textit{close-on-exec} sulle directory che apre, in maniera trasparente +all'utente. + +\itindend{close-on-exec} + Il comportamento della funzione in relazione agli identificatori relativi al controllo di accesso verrà trattato in dettaglio in sez.~\ref{sec:proc_perms}, diff --git a/socket.tex b/socket.tex index 503234e..c69c9ee 100644 --- a/socket.tex +++ b/socket.tex @@ -300,10 +300,10 @@ non strettamente attinenti all'indicazione del tipo secondo i valori appena illustrati. Essi infatti possono essere combinati con un OR aritmetico delle ulteriori costanti: \begin{basedescript}{\desclabelwidth{2.9cm}\desclabelstyle{\nextlinelabel}} -\item[\const{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} - \itindex{close-on-exec} sul file descriptor del socket, ottenendo lo stesso - effetto del flag \const{O\_CLOEXEC} di \func{open} (vedi - tab.~\ref{tab:open_operation_flag}), di cui costituisce l'analogo. +\item[\const{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul + file descriptor del socket, ottenendo lo stesso effetto del flag + \const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}), + di cui costituisce l'analogo. \item[\const{SOCK\_NONBLOCK}] crea il socket in modalità non-bloccante, con effetti identici ad una successiva chiamata a \func{fcntl} per impostare il diff --git a/system.tex b/system.tex index 638c7ac..22f0eb1 100644 --- a/system.tex +++ b/system.tex @@ -1650,7 +1650,7 @@ di quest'ultimo. Nello specificare un limite, oltre a fornire dei valori specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette di sbloccare completamente l'uso di una risorsa. Si ricordi però che solo un processo con i privilegi di amministratore\footnote{per essere precisi in - questo caso quello che serve è la \itindex{capabilities} \textit{capability} + questo caso quello che serve è la \textit{capability} \const{CAP\_SYS\_RESOURCE} (vedi sez.~\ref{sec:proc_capabilities}).} può innalzare un limite al di sopra del valore corrente del limite massimo ed usare un valore qualsiasi per entrambi i limiti. @@ -1858,8 +1858,8 @@ che sia stata definita la macro \macro{\_GNU\_SOURCE}. Il primo argomento indica il \ids{PID} del processo di cui si vogliono cambiare i limiti e si può usare un valore nullo per indicare il processo chiamante. Per modificare i limiti di un altro processo, a meno di non avere privilegi -amministrativi,\footnote{anche in questo caso la \itindex{capabilities} - \textit{capability} necessaria è \const{CAP\_SYS\_RESOURCE} (vedi +amministrativi,\footnote{anche in questo caso la \textit{capability} + necessaria è \const{CAP\_SYS\_RESOURCE} (vedi sez.~\ref{sec:proc_capabilities}).} l'\ids{UID} ed il \ids{GID} reale del chiamante devono coincidere con \ids{UID} e \ids{GID} del processo indicato per i tre gruppi reale, effettivo e salvato. @@ -2019,7 +2019,7 @@ prototipo è: La funzione attiva il salvataggio dei dati sul file indicato dal \textit{pathname} contenuti nella stringa puntata da \param{filename}; la funzione richiede che il processo abbia i privilegi di amministratore (è -necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi +necessaria la \textit{capability} \const{CAP\_SYS\_PACCT}, vedi sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per \param{filename} il \textit{BSD accounting} viene invece disabilitato. Un semplice esempio per l'uso di questa funzione è riportato nel programma @@ -2376,9 +2376,9 @@ sia necessario; il suo prototipo è: Dato che modificare l'ora ha un impatto su tutto il sistema il cambiamento dell'orologio è una operazione privilegiata e questa funzione può essere usata -solo da un processo con i privilegi di amministratore (per la precisione la la -\itindex{capabilities} capability \const{CAP\_SYS\_TIME}), altrimenti la -chiamata fallirà con un errore di \errcode{EPERM}. +solo da un processo con i privilegi di amministratore (per la precisione la +\textit{capability} \const{CAP\_SYS\_TIME}), altrimenti la chiamata fallirà +con un errore di \errcode{EPERM}. Data la scarsa precisione nell'uso di \type{time\_t}, che ha una risoluzione massima di un secondo, quando si devono effettuare operazioni sui tempi di @@ -2414,10 +2414,9 @@ non dipende dall'uso di queste strutture. Come nel caso di \func{stime} anche \func{settimeofday} può essere utilizzata solo da un processo coi privilegi di amministratore e più precisamente con la -\itindex{capability} capacità \const{CAP\_SYS\_TIME}. Si tratta comunque di -una condizione generale che continua a valere per qualunque funzione che vada -a modificare l'orologio di sistema, comprese tutte quelle che tratteremo in -seguito. +capacità \const{CAP\_SYS\_TIME}. Si tratta comunque di una condizione generale +che continua a valere per qualunque funzione che vada a modificare l'orologio +di sistema, comprese tutte quelle che tratteremo in seguito. Il secondo argomento di entrambe le funzioni è una struttura \struct{timezone}, che storicamente veniva utilizzata per specificare appunto -- 2.30.2