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
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
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
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
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}
\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}
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
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
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 *})
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
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
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 è
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
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}
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
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}
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
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},
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
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.
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.
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
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
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