From 5da5870ef70a2b793118d14ec547a293927c0d3c Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Thu, 22 Aug 2019 17:42:28 +0200 Subject: [PATCH] Riordinati riferimenti al close-on-exec. --- fileadv.tex | 10 ++++---- fileio.tex | 68 ++++++++++++++++++++++++++++------------------------ ipc.tex | 3 +-- procadv.tex | 4 ++-- prochand.tex | 18 +++++++------- 5 files changed, 53 insertions(+), 50 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 45a5615..34dcbf9 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1622,11 +1622,11 @@ viene totalmente ignorato e l'allocazione è sempre dinamica. La seconda versione della funzione, \func{epoll\_create1} è stata introdotta come estensione della precedente (è disponibile solo a partire dal kernel 2.6.27) per poter passare dei flag di controllo come maschera binaria in fase -di creazione del file descriptor. Al momento l'unico valore legale -per \param{flags} (a parte lo zero) è \constd{EPOLL\_CLOEXEC}, che consente di +di creazione del file descriptor. Al momento l'unico valore legale per +\param{flags} (a parte lo zero) è \constd{EPOLL\_CLOEXEC}, che consente di impostare in maniera atomica sul file descriptor il flag di -\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 +\textit{close-on-exec} (vedi sez.~\ref{sec:proc_exec} e +sez.~\ref{sec:file_shared_access}) senza che sia necessaria una successiva chiamata a \func{fcntl}. Una volta ottenuto un file descriptor per \textit{epoll} il passo successivo è @@ -2197,7 +2197,7 @@ file descriptor restituito da \func{signalfd} cerca di seguire la semantica di un sistema unix-like anche con altre \textit{system call}; in particolare esso resta aperto (come ogni altro file descriptor) attraverso una chiamata ad \func{exec}, a meno che non lo si sia creato con il flag di -\const{SFD\_CLOEXEC} o si sia successivamente impostato il +\const{SFD\_CLOEXEC} o si sia successivamente impostato il \textit{close-on-exec} con \func{fcntl}. Questo comportamento corrisponde anche alla ordinaria semantica relativa ai segnali bloccati, che restano pendenti attraverso una \func{exec}. diff --git a/fileio.tex b/fileio.tex index a0d5475..40dcd9f 100644 --- a/fileio.tex +++ b/fileio.tex @@ -1361,16 +1361,22 @@ entrambi. Questo consente una sorta di ``\textsl{sincronizzazione}'' automatica della posizione sul file fra padre e figlio che occorre tenere presente. +\itindbeg{close-on-exec} + Si noti inoltre che in questo caso anche i flag di stato del file, essendo mantenuti nella struttura \kstruct{file} della \textit{file table}, vengono condivisi, per cui una modifica degli stessi con \func{fcntl} (vedi sez.~\ref{sec:file_fcntl_ioctl}) si applicherebbe a tutti processi che condividono la voce nella \textit{file table}. Ai file però sono associati -anche altri flag, dei quali l'unico usato al momento è \constd{FD\_CLOEXEC}, -detti \itindex{file~descriptor~flags} \textit{file descriptor flags}; questi -invece sono mantenuti in \kstruct{file\_struct}, e perciò sono locali per -ciascun processo e non vengono modificati dalle azioni degli altri anche in -caso di condivisione della stessa voce della \textit{file table}. +anche altri flag detti \itindex{file~descriptor~flags} \textit{file descriptor + flags}. Questi invece sono mantenuti in \kstruct{file\_struct}, e perciò +sono locali per ciascun processo e non vengono modificati dalle azioni degli +altri anche in caso di condivisione della stessa voce della \textit{file + table}; l'unico usato al momento è quello di \textit{close-on-exec} che +indica che il file descriptor deve essere chiuso in una \func{exec} (vedi +sez.~\ref{sec:proc_exec}). + +\itindend{close-on-exec} Si tenga presente dunque che in un sistema unix-like è sempre possibile per più processi accedere in contemporanea allo stesso file e che non esistono, a @@ -1467,7 +1473,7 @@ 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} attivo (vedi -sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}), questo verrà +sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_shared_access}), questo verrà cancellato nel file descriptor restituito come copia. L'uso principale di questa funzione è nella shell per la redirezione dei file @@ -2781,7 +2787,7 @@ più sicura l'esecuzione ed evitare la necessità di avere disponibile La funzione segue la sintassi delle \textit{at-functions} per indicare il file da eseguire, e per il resto si comporta esattamente con come \func{execve} (le cui caratteristiche sono già state illustrate in -sez.~\ref{sec:file_stat}). Diventa così possibile indicare il programma da +sez.~\ref{sec:proc_exec}). Diventa così possibile indicare il programma da eseguire sia con un \textit{pathname} assoluto che relativo (usando \const{AT\_FDCWD} come \param{dirfd}), oppure con un \textit{pathname} relativo alla directory indicata da \param{dirfd}. In quest'ultima forma l'uso @@ -2792,10 +2798,11 @@ Inoltre usando, per \param{flags} il valore \const{AT\_EMPTY\_PATH}, si può indicare direttamente il file da eseguire aprendolo e passandone il file descriptor nell'argomento \param{dirfd}, ottenendo il comportamento di \func{fexecve}; quest'ultima infatti è sostanzialmente equivalente -all'esecuzione di: \includecodesnip{listati/fexecve.c} l'unico altro valore -utilizzabile per \param{flags} è \const{AT\_SYMLINK\_NOFOLLOW} che fa fallire -la funzione con un errore di \errval{ELOOP}, se il file indicato è un link -simbolico. +all'esecuzione di: +\includecodesnip{listati/fexecve.c} +l'unico altro valore utilizzabile per \param{flags} è +\const{AT\_SYMLINK\_NOFOLLOW}, che fa fallire la funzione con un errore di +\errval{ELOOP} se il file indicato è un link simbolico. Quando si usano \func{execveat} o \func{fexecve} per eseguire un programma attraverso un file descriptor è naturale impostare sullo stesso il flag di @@ -2808,7 +2815,7 @@ file descriptor, si potrebbe arrivare all'esaurimento degli stessi. Tutto questo però non è vero quando si vuole eseguire uno script; in tal caso infatti (si ricordi quanto detto a questo riguardo in -sez.~\ref{sec:file_stat}) il programma che viene effettivamente messo in +sez.~\ref{sec:proc_exec}) il programma che viene effettivamente messo in esecuzione è l'interprete indicato nella riga iniziale dello script, che poi legge ed interpreta il codice da eseguire dallo script stesso. Ma se lancia lo script usando un file descriptor su cui è attivo il flag di @@ -2868,9 +2875,11 @@ prototipo è: {La funzione ha valori di ritorno diversi a seconda dell'operazione richiesta in caso di successo mentre ritorna sempre $-1$ per un errore, nel qual caso \var{errno} assumerà valori diversi che dipendono dal tipo di operazione, - l'unico valido in generale è: + gli unici con signifiato generico sono: \begin{errlist} \item[\errcode{EBADF}] \param{fd} non è un file aperto. + \item[\errcode{EINVAL}] \param{cmd} non è un comando supportato dal kernel + corrente. \end{errlist} } \end{funcproto} @@ -2898,8 +2907,6 @@ 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[\constd{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma in più attiva il flag di \textit{close-on-exec} sul file descriptor duplicato, in modo da evitare una successiva chiamata con @@ -2909,24 +2916,23 @@ il nome indicato nel precedente prototipo), è riportata di seguito: sez.~\ref{sec:intro_gcc_glibc_std}). \item[\constd{F\_GETFD}] restituisce il valore dei \textit{file descriptor - 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 - \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. + flags} (vedi sez.~\ref{sec:file_shared_access}) 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 \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[\constd{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 - \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} + (vedi sez.~\ref{sec:file_shared_access}) 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 \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.} \item[\constd{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 diff --git a/ipc.tex b/ipc.tex index f50eeac..ddf28dc 100644 --- a/ipc.tex +++ b/ipc.tex @@ -369,8 +369,7 @@ La funzione restituisce il puntatore ad uno stream associato alla 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 diff --git a/procadv.tex b/procadv.tex index e14392f..d32fc02 100644 --- a/procadv.tex +++ b/procadv.tex @@ -2038,7 +2038,7 @@ utilizzati soltanto se si sono specificati rispettivamente i flag \const{CLONE\_CHILD\_SETTID}. La funzione ritorna un l'identificatore del nuovo \textit{task}, denominato -\texttt{Thread ID} (da qui in avanti \ids{TID}) il cui significato è analogo +\textit{Thread ID} (da qui in avanti \ids{TID}) il cui significato è analogo al \ids{PID} dei normali processi e che a questo corrisponde qualora si crei un processo ordinario e non un \textit{thread}. @@ -2067,7 +2067,7 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa padre la \textit{file descriptor table} (vedi sez.~\ref{sec:file_fd}), questo significa che ogni \textit{file descriptor} aperto da un processo verrà visto anche dall'altro e che ogni chiusura o cambiamento dei - \textit{file descriptor flag} di un \textit{file descriptor} verrà per + \textit{file descriptor flags} di un \textit{file descriptor} verrà per entrambi. Se non viene impostato il processo figlio eredita una copia della diff --git a/prochand.tex b/prochand.tex index 5afe0d2..12eee1f 100644 --- a/prochand.tex +++ b/prochand.tex @@ -612,7 +612,7 @@ 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 \textit{close-on-exec} impostati - (vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl_ioctl}); + (vedi sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_shared_access}); \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 @@ -1640,20 +1640,18 @@ nell'esecuzione della funzione \func{exec}, queste sono: \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 \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 +\func{exec} dipende dal valore che ha il flag di \textit{close-on-exec} per +ciascun \textit{file descriptor} (vedi sez.~\ref{sec:file_shared_access}). 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 +aperti attraverso una \func{exec}, a meno di non aver impostato esplicitamente +(in apertura o con \func{fnctl}) 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 \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 -- 2.30.2