ad una dimensione identica al valore massimo del numero di file descriptor
utilizzabili, vale a dire impostare il contenuto di
\sysctlfile{kernel/rtsig-max} allo stesso valore del contenuto di
-\sysctlfile{fs/file-max}.
+\sysctlfilem{fs/file-max}.
% TODO fare esempio che usa O_ASYNC
\label{fig:sys_statfs}
\end{figure}
-\conffilebeg{/etc/mtab} La \acr{glibc} provvede infine una serie di funzioni
-per la gestione dei due file \conffiled{/etc/fstab}\footnote{più precisamente
- \funcm{setfsent}, \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec},
- \funcm{endfsent}.} ed \conffile{/etc/mtab}\footnote{più precisamente
- \funcm{setmntent}, \funcm{getmntent},\funcm{getmntent\_r},
- \funcm{addmntent},\funcm{endmntent}, \funcm{hasmntopt}.} che
-convenzionalmente sono usati in quasi tutti i sistemi unix-like per mantenere
-rispettivamente le informazioni riguardo ai filesystem da montare e a quelli
-correntemente montati. Le funzioni servono a leggere il contenuto di questi
-file in opportune strutture \structd{fstab} e \structd{mntent}, e, nel caso di
-\conffile{/etc/mtab}, per inserire e rimuovere le voci presenti nel file.
+\conffilebeg{/etc/mtab}
+
+La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due
+file \conffiled{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+ \funcm{getfsent}, \funcm{getfsfile}, \funcm{getfsspec}, \funcm{endfsent}.}
+ed \conffile{/etc/mtab}\footnote{più precisamente \funcm{setmntent},
+ \funcm{getmntent},\funcm{getmntent\_r}, \funcm{addmntent},\funcm{endmntent},
+ \funcm{hasmntopt}.} che convenzionalmente sono usati in quasi tutti i
+sistemi unix-like per mantenere rispettivamente le informazioni riguardo ai
+filesystem da montare e a quelli correntemente montati. Le funzioni servono a
+leggere il contenuto di questi file in opportune strutture \structd{fstab} e
+\structd{mntent}, e, nel caso di \conffile{/etc/mtab}, per inserire e
+rimuovere le voci presenti nel file.
In generale si dovrebbero usare queste funzioni, in particolare quelle
relative a \conffile{/etc/mtab}, quando si debba scrivere un programma che
disponibile e sempre aggiornata. Per questo motivo tralasceremo la
trattazione, di queste funzioni, rimandando al manuale della \acr{glibc}
\cite{GlibcMan} per la documentazione completa.
+
\conffileend{/etc/mtab}
% TODO (bassa priorità) scrivere delle funzioni (getfsent e getmntent &C)
Con il kernel 2.6.25 e le \textit{file capabilities} il \textit{bounding set}
è diventato una proprietà di ciascun processo, che viene propagata invariata
sia attraverso una \func{fork} che una \func{exec}. In questo caso il file
-\sysctlfile{kernel/cap-bound} non esiste e \texttt{init} non ha nessun
+\sysctlfilem{kernel/cap-bound} non esiste e \texttt{init} non ha nessun
ruolo speciale, inoltre in questo caso all'avvio il valore iniziale prevede la
presenza di tutte le capacità (compresa \const{CAP\_SETPCAP}).
\chapter{La gestione dell'I/O su file}
\label{cha:file_IO_interface}
-Esamineremo in questo capitolo le due interfacce di programmazione che
+Esamineremo in questo capitol le due interfacce di programmazione che
consentono di gestire i dati mantenuti nei file. Cominceremo con quella nativa
del sistema, detta dei \textit{file descriptor}, che viene fornita
direttamente dalle \textit{system call} e che non prevede funzionalità evolute
\textbf{File} & \textbf{Significato} \\
\hline
\hline
- \const{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard
- input}.\\
- \const{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard
- output}.\\
- \const{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
- error}.\\
+ \constd{STDIN\_FILENO} & \textit{file descriptor} dello \textit{standard
+ input}.\\
+ \constd{STDOUT\_FILENO} & \textit{file descriptor} dello \textit{standard
+ output}.\\
+ \constd{STDERR\_FILENO} & \textit{file descriptor} dello \textit{standard
+ error}.\\
\hline
\end{tabular}
\caption{Costanti definite in \headfile{unistd.h} per i file standard.}
\textbf{Flag} & \textbf{Significato} \\
\hline
\hline
- \const{O\_RDONLY} & Apre il file in sola lettura.\\
- \const{O\_WRONLY} & Apre il file in sola scrittura.\\
- \const{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\
+ \constd{O\_RDONLY} & Apre il file in sola lettura.\\
+ \constd{O\_WRONLY} & Apre il file in sola scrittura.\\
+ \constd{O\_RDWR} & Apre il file sia in lettura che in scrittura.\\
\hline
\end{tabular}
\caption{Le tre costanti che identificano le modalità di accesso
il valore indicato in \param{flags} viene salvato nei \textit{file status
flags}, e può essere riletto con \func{fcntl} (vedi
sez.~\ref{sec:file_fcntl_ioctl}), il relativo valore può essere poi ottenuto
-un AND aritmetico della maschera binaria \const{O\_ACCMODE}, ma non può essere
-modificato. Nella \acr{glibc} sono definite inoltre \const{O\_READ} come
-sinonimo di \const{O\_RDONLY} e \const{O\_WRITE} come sinonimo di
+un AND aritmetico della maschera binaria \constd{O\_ACCMODE}, ma non può essere
+modificato. Nella \acr{glibc} sono definite inoltre \constd{O\_READ} come
+sinonimo di \const{O\_RDONLY} e \constd{O\_WRITE} come sinonimo di
\const{O\_WRONLY}.\footnote{si tratta di definizioni completamente fuori
- standard, attinenti, insieme a \const{O\_EXEC} che permetterebbe l'apertura
+ standard, attinenti, insieme a \constd{O\_EXEC} che permetterebbe l'apertura
di un file per l'esecuzione, ad un non meglio precisato ``\textit{GNU
system}''; pur essendo equivalenti alle definizioni classiche non è
comunque il caso di utilizzarle.}
\textbf{Flag} & \textbf{Significato} \\
\hline
\hline
- \const{O\_CREAT} & Se il file non esiste verrà creato, con le regole
+ \constd{O\_CREAT} & Se il file non esiste verrà creato, con le regole
di titolarità del file viste in
sez.~\ref{sec:file_ownership_management}. Se si
imposta questo flag l'argomento \param{mode} deve
essere sempre specificato.\\
- \const{O\_DIRECTORY}& Se \param{pathname} non è una directory la
+ \constd{O\_DIRECTORY}&Se \param{pathname} non è una directory la
chiamata fallisce. Questo flag, introdotto con il
kernel 2.1.126, è specifico di Linux e
serve ad evitare dei possibili
usato al di fuori dell'implementazione di
\func{opendir}, ed è utilizzabile soltanto se si è
definita la macro \macro{\_GNU\_SOURCE}.\\
- \const{O\_EXCL} & Deve essere usato in congiunzione con
+ \constd{O\_EXCL} & Deve essere usato in congiunzione con
\const{O\_CREAT} ed in tal caso impone che il file
indicato da \param{pathname} non sia già esistente
(altrimenti causa il fallimento della chiamata con
un errore di \errcode{EEXIST}).\\
- \const{O\_LARGEFILE}& Viene usato sui sistemi a 32 bit per richiedere
+ \constd{O\_LARGEFILE}&Viene usato sui sistemi a 32 bit per richiedere
l'apertura di file molto grandi, la cui
dimensione non è rappresentabile con la versione a
32 bit del tipo \type{off\_t}, utilizzando
delle funzioni che si attiva assegnando a $64$ la
macro \macro{\_FILE\_OFFSET\_BITS}, e non usare mai
questo flag.\\
- \const{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo
+ \constd{O\_NOCTTY} & Se \param{pathname} si riferisce ad un dispositivo
di terminale, questo non diventerà il terminale di
controllo, anche se il processo non ne ha ancora
uno (si veda sez.~\ref{sec:sess_ctrl_term}).\\
- \const{O\_NOFOLLOW} & Se \param{pathname} è un collegamento simbolico
+ \constd{O\_NOFOLLOW}& Se \param{pathname} è un collegamento simbolico
la chiamata fallisce. Questa è un'estensione BSD
aggiunta in Linux a partire dal kernel
2.1.126, ed utilizzabile soltanto se si è definita
la macro \macro{\_GNU\_SOURCE}.\\
- \const{O\_TRUNC} & Se usato su un file di dati aperto in scrittura,
+ \constd{O\_TRUNC} & Se usato su un file di dati aperto in scrittura,
ne tronca la lunghezza a zero; con un terminale o
una fifo viene ignorato, negli altri casi il
comportamento non è specificato.\\
Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle
\textsl{modalità di apertura}.\footnote{la \acr{glibc} definisce anche i due
- flag \const{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e
- \const{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi
+ flag \constd{O\_SHLOCK}, che aprirebbe il file con uno \textit{shared lock} e
+ \constd{O\_EXLOCK} che lo aprirebbe con un \textit{exclusive lock} (vedi
sez.~\ref{sec:file_locking}, si tratta di opzioni specifiche di BSD, che non
esistono con Linux.} Uno di questi, \const{O\_EXCL}, ha senso solo se usato
in combinazione a \const{O\_CREAT} quando si vuole creare un nuovo file per
\textbf{Flag} & \textbf{Significato} \\
\hline
\hline
- \const{O\_APPEND} & Il file viene aperto in \textit{append mode}. La
+ \constd{O\_APPEND} & Il file viene aperto in \textit{append mode}. La
posizione sul file (vedi sez.~\ref{sec:file_lseek})
viene sempre mantenuta sulla sua coda, per cui
quanto si scrive viene sempre aggiunto al contenuto
verificarsi \textit{race condition} con una
sovrapposizione dei dati se più di un processo
scrive allo stesso tempo.\\
- \const{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi
+ \constd{O\_ASYNC} & Apre il file per l'I/O in modalità asincrona (vedi
sez.~\ref{sec:signal_driven_io}). Quando è
impostato viene generato il segnale \signal{SIGIO}
tutte le volte che il file è pronto per le
in fase di apertura del file, deve
invece essere attivato successivamente con
\func{fcntl}.\\
- \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
- \textit{race condition} che si potrebbe verificare
- con i \textit{thread} fra l'apertura del file e
- l'impostazione della suddetta modalità con
- \func{fcntl} (vedi
- sez.~\ref{sec:file_fcntl_ioctl}).\\
- \const{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in
+ \constd{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
+ \textit{race condition} che si potrebbe verificare
+ con i \textit{thread} fra l'apertura del file e
+ l'impostazione della suddetta modalità con
+ \func{fcntl} (vedi
+ sez.~\ref{sec:file_fcntl_ioctl}).\\
+ \constd{O\_DIRECT} & Esegue l'I/O direttamente dalla memoria in
\textit{user space} in maniera sincrona, in modo da
scavalcare i meccanismi di bufferizzazione del
kernel. Introdotto con il kernel 2.4.10 ed
utilizzabile soltanto se si è definita la
macro \macro{\_GNU\_SOURCE}.\\
- \const{O\_NOATIME} & Blocca l'aggiornamento dei tempi di accesso dei
+ \constd{O\_NOATIME}& Blocca l'aggiornamento dei tempi di accesso dei
file (vedi sez.~\ref{sec:file_file_times}). Per
molti filesystem questa funzionalità non è
disponibile per il singolo file ma come opzione
montaggio. Introdotto con il kernel 2.6.8 ed
utilizzabile soltanto se si è definita la
macro \macro{\_GNU\_SOURCE}.\\
- \const{O\_NONBLOCK}& Apre il file in \textsl{modalità non bloccante} per
+ \constd{O\_NONBLOCK}&Apre il file in \textsl{modalità non bloccante} per
le operazioni di I/O (vedi
sez.~\ref{sec:file_noblocking}). Questo significa
il fallimento delle successive operazioni di
si vuole aprire un file di dispositivo per eseguire
una \func{ioctl} (vedi
sez.~\ref{sec:file_fcntl_ioctl}).\\
- \const{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma
+ \constd{O\_NDELAY} & In Linux è un sinonimo di \const{O\_NONBLOCK}, ma
origina da SVr4, dove però causava il ritorno da
una \func{read} con un valore nullo e non con un
errore, questo introduce un'ambiguità, dato che
come vedremo in sez.~\ref{sec:file_read} il ritorno
di un valore nullo da parte di \func{read} ha
il significato di una \textit{end-of-file}.\\
- \const{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni
+ \constd{O\_SYNC} & Apre il file per l'input/output sincrono. Ogni
scrittura si bloccherà fino alla conferma
dell'arrivo di tutti i dati e di tutti i metadati
sull'hardware sottostante (in questo significato
solo dal kernel 2.6.33).\\
- \const{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni
+ \constd{O\_DSYNC} & Apre il file per l'input/output sincrono. Ogni
scrittura di dati si bloccherà fino alla conferma
dell'arrivo degli stessi e della parte di metadati
ad essi relativa sull'hardware sottostante (in
sull'argomento in sez.~\ref{sec:file_fcntl_ioctl}).
Il flag \const{O\_ASYNC} (che, per per compatibilità con BSD, si può indicare
-anche con la costante \const{FASYNC}) è definito come possibile valore per
+anche con la costante \constd{FASYNC}) è definito come possibile valore per
\func{open}, ma per un bug dell'implementazione,\footnote{segnalato come
ancora presente nella pagina di manuale almeno fino al Settembre 2011.} non
solo non attiva il comportamento citato, ma se usato richiede di essere
dall'argomento \param{whence}, che deve essere indicato con una delle costanti
riportate in tab.~\ref{tab:lseek_whence_values}.\footnote{per compatibilità
con alcune vecchie notazioni questi valori possono essere rimpiazzati
- rispettivamente con 0, 1 e 2 o con \const{L\_SET}, \const{L\_INCR} e
- \const{L\_XTND}.} Si tenga presente che la chiamata a \func{lseek} non causa
+ rispettivamente con 0, 1 e 2 o con \constd{L\_SET}, \constd{L\_INCR} e
+ \constd{L\_XTND}.} Si tenga presente che la chiamata a \func{lseek} non causa
nessun accesso al file, si limita a modificare la posizione corrente (cioè il
campo \var{f\_pos} della struttura \kstruct{file}, vedi
fig.~\ref{fig:file_proc_file}). Dato che la funzione ritorna la nuova
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{SEEK\_SET} & Si fa riferimento all'inizio del file: il valore, che
+ \constd{SEEK\_SET}& Si fa riferimento all'inizio del file: il valore, che
deve essere positivo, di \param{offset} indica
direttamente la nuova posizione corrente.\\
- \const{SEEK\_CUR} & Si fa riferimento alla posizione corrente del file:
+ \constd{SEEK\_CUR}& Si fa riferimento alla posizione corrente del file:
ad essa viene sommato \param{offset}, che può essere
negativo e positivo, per ottenere la nuova posizione
corrente.\\
- \const{SEEK\_END} & Si fa riferimento alla fine del file: alle dimensioni
+ \constd{SEEK\_END}& Si fa riferimento alla fine del file: alle dimensioni
del file viene sommato \param{offset}, che può essere
negativo e positivo, per ottenere la nuova posizione
corrente.\\
\hline
- \const{SEEK\_DATA}& Sposta la posizione nel file sull'inizio del primo
+ \constd{SEEK\_DATA}&Sposta la posizione nel file sull'inizio del primo
blocco di dati dopo un \textit{hole} che segue (o
coincide) con la posizione indicata da \param{offset}
(dal kernel 3.1).\\
- \const{SEEK\_HOLE}& Sposta la posizione sul file all'inizio del primo
+ \constd{SEEK\_HOLE}&Sposta la posizione sul file all'inizio del primo
\textit{hole} nel file che segue o inizia
con \param{offset}, oppure si porta su \param{offset}
se questo è all'interno di un \textit{hole}, oppure si
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 è \const{FD\_CLOEXEC},
+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
argomenti si utilizza un \textit{pathname} relativo questo sarà risolto
rispetto alla directory indicata da \param{dirfd}. Qualora invece si usi un
\textit{pathname} assoluto \param{dirfd} verrà semplicemente ignorato. Infine
-se per \param{dirfd} si usa il valore speciale \const{AT\_FDCWD}, la
+se per \param{dirfd} si usa il valore speciale \constd{AT\_FDCWD}, la
risoluzione sarà effettuata rispetto alla directory di lavoro corrente del
processo. Si tenga presente però che questa, come le altre costanti
\texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole
\textbf{Costante} & \textbf{Significato} \\
\hline
\hline
- \const{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la
- dereferenziazione dei collegamenti simbolici.\\
- \const{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la
- dereferenziazione dei collegamenti simbolici
- (usato esplicitamente solo da \func{linkat}).\\
- \const{AT\_EACCES} & Usato solo da \func{faccessat}, richiede che
- il controllo dei permessi sia fatto usando
- l'\ids{UID} effettivo invece di quello
- reale.\\
- \const{AT\_REMOVEDIR} & Usato solo da \func{unlinkat}, richiede che
- la funzione si comporti come \func{rmdir}
- invece che come \func{unlink}.\\
+ \constd{AT\_SYMLINK\_NOFOLLOW}& Se impostato la funzione non esegue la
+ dereferenziazione dei collegamenti
+ simbolici.\\
+ \constd{AT\_SYMLINK\_FOLLOW}& Se impostato la funzione esegue la
+ dereferenziazione dei collegamenti simbolici
+ (usato esplicitamente solo da
+ \func{linkat}).\\
+ \constd{AT\_EACCES} & Usato solo da \func{faccessat}, richiede che
+ il controllo dei permessi sia fatto usando
+ l'\ids{UID} effettivo invece di quello
+ reale.\\
+ \constd{AT\_REMOVEDIR} & Usato solo da \func{unlinkat}, richiede che
+ la funzione si comporti come \func{rmdir}
+ invece che come \func{unlink}.\\
\hline
\end{tabular}
\caption{Le costanti utilizzate per i bit dell'argomento
errore restituiti e del tipo del terzo argomento (cui faremo riferimento con
il nome indicato nel precedente prototipo), è riportata di seguito:
\begin{basedescript}{\desclabelwidth{1.8cm}}
-\item[\const{F\_DUPFD}] trova il primo file descriptor disponibile di valore
+\item[\constd{F\_DUPFD}] trova il primo file descriptor disponibile di valore
maggiore o uguale ad \param{arg}, e ne fa un duplicato
di \param{fd}, ritorna il nuovo file descriptor in caso di successo e $-1$
in caso di errore. Oltre a \errval{EBADF} gli errori possibili sono
\itindbeg{close-on-exec}
-\item[\const{F\_DUPFD\_CLOEXEC}] ha lo stesso effetto di \const{F\_DUPFD}, ma
+\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
\const{F\_SETFD}. La funzionalità è stata introdotta con il kernel 2.6.24 ed
\macro{\_POSIX\_C\_SOURCE} ad un valore adeguato secondo quanto visto in
sez.~\ref{sec:intro_gcc_glibc_std}).
-\item[\const{F\_GETFD}] restituisce il valore dei \textit{file descriptor
+\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
\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}
+\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
\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
+\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
viene ignorato. Non sono previsti errori diversi da \errval{EBADF}. Il
comando permette di rileggere il valore di quei bit
flag} con la maschera \const{O\_ACCMODE} come già accennato in
sez.~\ref{sec:file_open_close}.
-\item[\const{F\_SETFL}] imposta il valore dei \textit{file status flags} al
+\item[\constd{F\_SETFL}] imposta il valore dei \textit{file status flags} al
valore specificato da \param{arg}, ritorna un valore nullo in caso di
successo o $-1$ in caso di errore. In generale possono essere impostati solo
i flag riportati in tab.~\ref{tab:open_operation_flag}, su Linux si possono
permessi di amministratore) ed \errcode{EINVAL} se si cerca di impostare
\const{O\_DIRECT} su un file che non supporta questo tipo di operazioni.
-\item[\const{F\_GETLK}] richiede un controllo sul file lock specificato da
+\item[\constd{F\_GETLK}] richiede un controllo sul file lock specificato da
\param{lock}, sovrascrivendo la struttura da esso puntata con il risultato,
ritorna un valore nullo in caso di successo o $-1$ in caso di errore. Come
per i due successivi comandi oltre a \errval{EBADF} se \param{lock} non è un
puntatore valido restituisce l'errore generico \errcode{EFAULT}. Questa
funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
-\item[\const{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
+\item[\constd{F\_SETLK}] richiede o rilascia un file lock a seconda di quanto
specificato nella struttura puntata da \param{lock}, ritorna un valore nullo
in caso di successo e $-1$ se il file lock è tenuto da qualcun altro, nel
qual caso si ha un errore di \errcode{EACCES} o \errcode{EAGAIN}. Questa
funzionalità è trattata in dettaglio in sez.~\ref{sec:file_posix_lock}.
-\item[\const{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
+\item[\constd{F\_SETLKW}] identica a \const{F\_SETLK} eccetto per il fatto che
la funzione non ritorna subito ma attende che il blocco sia rilasciato, se
l'attesa viene interrotta da un segnale la funzione restituisce $-1$ e
imposta \var{errno} a \errcode{EINTR}. Questa funzionalità è trattata in
dettaglio in sez.~\ref{sec:file_posix_lock}.
-\item[\const{F\_GETOWN}] restituisce in caso di successo l'identificatore del
+\item[\constd{F\_GETOWN}] restituisce in caso di successo l'identificatore del
processo o del \textit{process group} (vedi sez.~\ref{sec:sess_proc_group})
che è preposto alla ricezione del segnale \signal{SIGIO} (o l'eventuale
segnale alternativo impostato con \const{F\_SETSIG}) per gli eventi
il comportamento del comando può risultare diverso a seconda delle versioni
della \acr{glibc} e del kernel.
-\item[\const{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
+\item[\constd{F\_SETOWN}] imposta, con il valore dell'argomento \param{arg},
l'identificatore del processo o del \textit{process group} che riceverà i
segnali \signal{SIGIO} e \signal{SIGURG} per gli eventi associati al file
descriptor \param{fd}. Ritorna un valore nullo in caso di successo o $-1$ in
interpretato come l'identificatore di un processo o di un \textit{process
group}.
-\item[\const{F\_GETOWN\_EX}] legge nella struttura puntata
+\item[\constd{F\_GETOWN\_EX}] legge nella struttura puntata
dall'argomento \param{owner} l'identificatore del processo, \textit{thread}
o \textit{process group} (vedi sez.~\ref{sec:sess_proc_group}) che è
preposto alla ricezione dei segnali \signal{SIGIO} e \signal{SIGURG} per gli
di \const{F\_GETOWN}. Il comando è specifico di Linux ed utilizzabile solo
se si è definita la macro \macro{\_GNU\_SOURCE}.
-\item[\const{F\_SETOWN\_EX}] imposta con il valore della struttura
+\item[\constd{F\_SETOWN\_EX}] imposta con il valore della struttura
\struct{f\_owner\_ex} puntata \param{owner}, l'identificatore del processo o
del \textit{process group} che riceverà i segnali \signal{SIGIO} e
\signal{SIGURG} per gli eventi associati al file
riportata in fig.~\ref{fig:f_owner_ex}, in cui il primo campo indica il tipo
di identificatore il cui valore è specificato nel secondo campo, che assume
lo stesso significato di \param{arg} per \const{F\_SETOWN}. Per il campo
- \var{type} i soli valori validi sono \const{F\_OWNER\_TID},
- \const{F\_OWNER\_PID} e \const{F\_OWNER\_PGRP}, che indicano rispettivamente
- che si intende specificare con \var{pid} un \textit{Tread ID}, un
- \textit{Process ID} o un \textit{Process Group ID}. A differenza di
- \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà sia
- \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che
+ \var{type} i soli valori validi sono \constd{F\_OWNER\_TID},
+ \constd{F\_OWNER\_PID} e \constd{F\_OWNER\_PGRP}, che indicano
+ rispettivamente che si intende specificare con \var{pid} un \textit{Tread
+ ID}, un \textit{Process ID} o un \textit{Process Group ID}. A differenza
+ di \const{F\_SETOWN} se si specifica un \textit{Tread ID} questo riceverà
+ sia \signal{SIGIO} (o il segnale impostato con \const{F\_SETSIG}) che
\signal{SIGURG}. Il comando è specifico di Linux, è disponibile solo a
partire dal kernel 2.6.32, ed è utilizzabile solo se si è definita la macro
\macro{\_GNU\_SOURCE}.
-\item[\const{F\_GETSIG}] restituisce il valore del segnale inviato dai vari
+\item[\constd{F\_GETSIG}] restituisce il valore del segnale inviato dai vari
meccanismi di I/O asincrono associati al file descriptor \param{fd} (quelli
trattati in sez.~\ref{sec:file_asyncronous_operation}) in caso di successo o
$-1$ in caso di errore, il terzo argomento viene ignorato. Non sono previsti
essere anche lo stesso \signal{SIGIO}. Il comando è specifico di Linux ed
utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}.
-\item[\const{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di I/O
- asincrono associati al file descriptor \param{fd} (quelli trattati in
+\item[\constd{F\_SETSIG}] imposta il segnale inviato dai vari meccanismi di
+ I/O asincrono associati al file descriptor \param{fd} (quelli trattati in
sez.~\ref{sec:file_asyncronous_operation}) al valore indicato
da \param{arg}, ritorna un valore nullo in caso di successo o $-1$ in caso
di errore. Oltre a \errval{EBADF} gli errori possibili sono
sez.~\ref{sec:sig_real_time}), ed in particolare la capacità di essere
accumulati in una coda prima della notifica.
-\item[\const{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il
+\item[\constd{F\_GETLEASE}] restituisce il tipo di \textit{file lease} che il
processo detiene nei confronti del file descriptor \var{fd} o $-1$ in caso
di errore, il terzo argomento viene ignorato. Non sono previsti errori
diversi da \errval{EBADF}. Il comando è specifico di Linux ed utilizzabile
solo se si è definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è
trattata in dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
-\item[\const{F\_SETLEASE}] imposta o rimuove a seconda del valore
+\item[\constd{F\_SETLEASE}] imposta o rimuove a seconda del valore
di \param{arg} un \textit{file lease} sul file descriptor \var{fd} a seconda
del valore indicato da \param{arg}. Ritorna un valore nullo in caso di
successo o $-1$ in caso di errore. Oltre a \errval{EBADF} si otterrà
definita la macro \macro{\_GNU\_SOURCE}. Questa funzionalità è trattata in
dettaglio in sez.~\ref{sec:file_asyncronous_lease}.
-\item[\const{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui
+\item[\constd{F\_NOTIFY}] attiva il meccanismo di notifica asincrona per cui
viene riportato al processo chiamante, tramite il segnale \signal{SIGIO} (o
altro segnale specificato con \const{F\_SETSIG}) ogni modifica eseguita o
direttamente sulla directory cui \var{fd} fa riferimento, o su uno dei file
dai kernel della serie 2.4.x, è trattata in dettaglio in
sez.~\ref{sec:file_asyncronous_lease}.
-\item[\const{F\_GETPIPE\_SZ}] restituisce in caso di successo la dimensione
+\item[\constd{F\_GETPIPE\_SZ}] restituisce in caso di successo la dimensione
del buffer associato alla \textit{pipe} \param{fd} (vedi
sez.~\ref{sec:ipc_pipes}) o $-1$ in caso di errore, il terzo argomento viene
ignorato. Non sono previsti errori diversi da \errval{EBADF}, che viene
specifico di Linux, è disponibile solo a partire dal kernel 2.6.35, ed è
utilizzabile solo se si è definita la macro \macro{\_GNU\_SOURCE}.
-\item[\const{F\_SETPIPE\_SZ}] imposta la dimensione del buffer associato alla
+\item[\constd{F\_SETPIPE\_SZ}] imposta la dimensione del buffer associato alla
\textit{pipe} \param{fd} (vedi sez.~\ref{sec:ipc_unix}) ad un valore uguale
o superiore a quello indicato dall'argomento \param{arg}. Ritorna un valore
nullo in caso di successo o $-1$ in caso di errore. Oltre a \errval{EBADF}
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 \textit{close-on-exec} sul file, in
+\item[\constd{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,
+\item[\constd{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
+\item[\constd{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 *})
che contiene un valore logico (un valore nullo disabilita, un valore non
nullo abilita).
-\item[\const{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non
+\item[\constd{FIONBIO}] abilita o disabilita sul file l'I/O in modalità non
bloccante; il terzo argomento deve essere un puntatore ad un intero (cioè di
tipo \texttt{const int *}) che contiene un valore logico (un valore nullo
disabilita, un valore non nullo abilita).
-\item[\const{FIOSETOWN}] imposta il processo che riceverà i segnali
+\item[\constd{FIOSETOWN}] imposta il processo che riceverà i segnali
\signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve
essere un puntatore ad un intero (cioè di tipo \texttt{const int *}) il cui
valore specifica il PID del processo.
-\item[\const{FIOGETOWN}] legge il processo che riceverà i segnali
+\item[\constd{FIOGETOWN}] legge il processo che riceverà i segnali
\signal{SIGURG} e \signal{SIGIO} generati sul file; il terzo argomento deve
essere un puntatore ad un intero (cioè di tipo \texttt{int *}) su cui sarà
scritto il PID del processo.
-\item[\const{FIONREAD}] legge il numero di byte disponibili in lettura sul
+\item[\constd{FIONREAD}] legge il numero di byte disponibili in lettura sul
file descriptor; questa operazione è disponibile solo su alcuni file
descriptor, in particolare sui socket (vedi sez.~\ref{sec:sock_ioctl_IP}) o
sui file descriptor di \textit{epoll} (vedi sez.~\ref{sec:file_epoll}), il
terzo argomento deve essere un puntatore ad un intero (cioè di tipo
\texttt{int *}) su cui sarà restituito il valore.
-\item[\const{FIOQSIZE}] restituisce la dimensione corrente di un file o di una
+\item[\constd{FIOQSIZE}] restituisce la dimensione corrente di un file o di una
directory, mentre se applicata ad un dispositivo fallisce con un errore di
\errcode{ENOTTY}; il terzo argomento deve essere un puntatore ad un intero
(cioè di tipo \texttt{int *}) su cui sarà restituito il valore.
``\verb|\n|'' con uno zero, mentre \func{fgets} aggiunge uno zero dopo il
\textit{newline}, che resta dentro la stringa.
+\itindbeg{buffer~overflow}
+
Se la lettura incontra la fine del file (o c'è un errore) viene restituito un
puntatore \val{NULL}, ed il buffer \param{buf} non viene toccato. L'uso di
\func{gets} è deprecato e deve essere assolutamente evitato, la funzione
infatti non controlla il numero di byte letti, per cui nel caso la stringa
-letta superi le dimensioni del buffer, si avrà un \itindex{buffer~overflow}
-\textit{buffer overflow}, con sovrascrittura della memoria del processo
-adiacente al buffer.\footnote{questa tecnica è spiegata in dettaglio e con
- molta efficacia nell'ormai famoso articolo di Aleph1 \cite{StS}.}
+letta superi le dimensioni del buffer, si avrà un \textit{buffer overflow},
+con sovrascrittura della memoria del processo adiacente al
+buffer.\footnote{questa tecnica è spiegata in dettaglio e con molta efficacia
+ nell'ormai famoso articolo di Aleph1 \cite{StS}.}
Questa è una delle vulnerabilità più sfruttate per guadagnare accessi non
autorizzati al sistema (i cosiddetti \textit{exploit}), basta infatti inviare
uno \textit{shell code}, cioè una sezione di programma che lancia una shell da
cui si potranno poi eseguire altri programmi.
+\itindend{buffer~overflow}
+
La funzione \func{fgets} non ha i precedenti problemi di \func{gets} in quanto
prende in ingresso la dimensione del buffer \param{size}, che non verrà mai
ecceduta in lettura. La funzione legge fino ad un massimo di \param{size}
\textbf{Valore} & \textbf{Modalità} \\
\hline
\hline
- \const{\_IONBF} & \textit{unbuffered}\\
- \const{\_IOLBF} & \textit{line buffered}\\
- \const{\_IOFBF} & \textit{fully buffered}\\
+ \constd{\_IONBF} & \textit{unbuffered}\\
+ \constd{\_IOLBF} & \textit{line buffered}\\
+ \constd{\_IOFBF} & \textit{fully buffered}\\
\hline
\end{tabular}
\caption{Valori dell'argomento \param{mode} di \func{setvbuf}
\textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo
dopo la chiusura del file; ma fintanto che il file è usato all'interno di una
funzione, può anche essere usata una variabile automatica. In
-\headfile{stdio.h} è definita la macro \const{BUFSIZ}, che indica le
+\headfile{stdio.h} è definita la costante \constd{BUFSIZ}, che indica le
dimensioni generiche del buffer di uno \textit{stream}, queste vengono usate
dalla funzione \func{setbuf}. Non è detto però che tale dimensione
corrisponda sempre al valore ottimale (che può variare a seconda del
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{FSETLOCKING\_INTERNAL}& Lo \textit{stream} userà da ora in poi il
- blocco implicito predefinito.\\
- \const{FSETLOCKING\_BYCALLER}& Al ritorno della funzione sarà l'utente a
- dover gestire da solo il locking dello
- \textit{stream}.\\
- \const{FSETLOCKING\_QUERY} & Restituisce lo stato corrente della
- modalità di blocco dello
- \textit{stream}.\\
+ \constd{FSETLOCKING\_INTERNAL}& Lo \textit{stream} userà da ora in poi il
+ blocco implicito predefinito.\\
+ \constd{FSETLOCKING\_BYCALLER}& Al ritorno della funzione sarà l'utente a
+ dover gestire da solo il locking dello
+ \textit{stream}.\\
+ \constd{FSETLOCKING\_QUERY} & Restituisce lo stato corrente della
+ modalità di blocco dello
+ \textit{stream}.\\
\hline
\end{tabular}
\caption{Valori dell'argomento \param{type} di \func{\_\_fsetlocking}
Utilizzando una \textit{fifo} tutti i dati passeranno, come per le
\textit{pipe}, attraverso un buffer nel kernel, senza transitare dal
-filesystem. Il fatto che siano associate ad un \itindex{inode}
-\textit{inode} presente sul filesystem serve infatti solo a fornire un punto
-di accesso per i processi, che permetta a questi ultimi di accedere alla
-stessa \textit{fifo} senza avere nessuna relazione, con una semplice
-\func{open}. Il comportamento delle funzioni di lettura e scrittura è identico
-a quello illustrato per le \textit{pipe} in sez.~\ref{sec:ipc_pipes}.
+filesystem. Il fatto che siano associate ad un \textit{inode} presente sul
+filesystem serve infatti solo a fornire un punto di accesso per i processi,
+che permetta a questi ultimi di accedere alla stessa \textit{fifo} senza avere
+nessuna relazione, con una semplice \func{open}. Il comportamento delle
+funzioni di lettura e scrittura è identico a quello illustrato per le
+\textit{pipe} in sez.~\ref{sec:ipc_pipes}.
Abbiamo già trattato in sez.~\ref{sec:file_mknod} le funzioni \func{mknod} e
\func{mkfifo} che permettono di creare una \textit{fifo}. Per utilizzarne una
Il problema è che anche così non c'è la sicurezza che il valore della chiave
sia univoco, infatti esso è costruito combinando il byte di \param{proj\_id)}
-con i 16 bit meno significativi \itindex{inode} dell'inode del file
-\param{pathname} (che vengono ottenuti attraverso \func{stat}, da cui derivano
-i possibili errori), e gli 8 bit meno significativi del numero del dispositivo
-su cui è il file. Diventa perciò relativamente facile ottenere delle
-collisioni, specie se i file sono su dispositivi con lo stesso \textit{minor
- number}, come \file{/dev/hda1} e \file{/dev/sda1}.
+con i 16 bit meno significativi dell'inode del file \param{pathname} (che
+vengono ottenuti attraverso \func{stat}, da cui derivano i possibili errori),
+e gli 8 bit meno significativi del numero del dispositivo su cui è il file.
+Diventa perciò relativamente facile ottenere delle collisioni, specie se i
+file sono su dispositivi con lo stesso \textit{minor number}, come
+\file{/dev/hda1} e \file{/dev/sda1}.
In genere quello che si fa è utilizzare un file comune usato dai programmi che
devono comunicare (ad esempio un header comune, o uno dei programmi che devono
\itindbeg{linked~list}
Una coda di messaggi è costituita da una \textit{linked list}.\footnote{una
- \itindex{linked~list} \textit{linked list} è una tipica struttura di dati,
- organizzati in una lista in cui ciascun elemento contiene un puntatore al
- successivo. In questo modo la struttura è veloce nell'estrazione ed
- immissione dei dati dalle estremità dalla lista (basta aggiungere un
- elemento in testa o in coda ed aggiornare un puntatore), e relativamente
- veloce da attraversare in ordine sequenziale (seguendo i puntatori), è
- invece relativamente lenta nell'accesso casuale e nella ricerca.} I nuovi
-messaggi vengono inseriti in coda alla lista e vengono letti dalla cima, in
-fig.~\ref{fig:ipc_mq_schema} si è riportato uno schema semplificato con cui
-queste strutture vengono mantenute dal kernel. Lo schema illustrato in realtà
-è una semplificazione di quello usato fino ai kernel della serie 2.2. A
-partire della serie 2.4 la gestione delle code di messaggi è effettuata in
-maniera diversa (e non esiste una struttura \struct{msqid\_ds} nel kernel), ma
-abbiamo mantenuto lo schema precedente dato che illustra in maniera più che
-adeguata i principi di funzionamento delle code di messaggi.
+ \textit{linked list} è una tipica struttura di dati, organizzati in una
+ lista in cui ciascun elemento contiene un puntatore al successivo. In questo
+ modo la struttura è veloce nell'estrazione ed immissione dei dati dalle
+ estremità dalla lista (basta aggiungere un elemento in testa o in coda ed
+ aggiornare un puntatore), e relativamente veloce da attraversare in ordine
+ sequenziale (seguendo i puntatori), è invece relativamente lenta
+ nell'accesso casuale e nella ricerca.} I nuovi messaggi vengono inseriti in
+coda alla lista e vengono letti dalla cima, in fig.~\ref{fig:ipc_mq_schema} si
+è riportato uno schema semplificato con cui queste strutture vengono mantenute
+dal kernel. Lo schema illustrato in realtà è una semplificazione di quello
+usato fino ai kernel della serie 2.2. A partire della serie 2.4 la gestione
+delle code di messaggi è effettuata in maniera diversa (e non esiste una
+struttura \struct{msqid\_ds} nel kernel), ma abbiamo mantenuto lo schema
+precedente dato che illustra in maniera più che adeguata i principi di
+funzionamento delle code di messaggi.
\itindend{linked~list}
\textit{fifo} si aveva il problema delle \textit{fifo} che restavano nel
filesystem). In questo caso però il problemi sono maggiori, sia perché è molto
più facile esaurire la memoria dedicata ad una coda di messaggi che gli
-\itindex{inode} \textit{inode} di un filesystem, sia perché, con il riutilizzo
-dei \ids{PID} da parte dei processi, un client eseguito in un momento
-successivo potrebbe ricevere un messaggio non indirizzato a lui.
+\textit{inode} di un filesystem, sia perché, con il riutilizzo dei \ids{PID}
+da parte dei processi, un client eseguito in un momento successivo potrebbe
+ricevere un messaggio non indirizzato a lui.
\subsection{I semafori}
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 ordinari, essi sono associati
-allo stesso \itindex{inode} inode. In questo modo è possibile effettuare una
-chiamata ad \func{mmap} sul file descriptor restituito da \func{shm\_open} ed
-i processi vedranno lo stesso segmento di memoria condivisa.
+allo stesso inode. In questo modo è possibile effettuare una chiamata ad
+\func{mmap} sul file descriptor restituito da \func{shm\_open} ed i processi
+vedranno lo stesso segmento di memoria condivisa.
Quando il nome non esiste si può creare un nuovo segmento specificando
\const{O\_CREAT}; in tal caso il segmento avrà (così come i nuovi file)
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
} % /proc/sys file name
+\newcommand{\sysctlfilem}[1]{%
+\texttt{/proc/sys/#1}%
+%\index{file!file di controllo (sotto \texttt{/proc/sys})!{#1}@{{\tt {#1}}}}\texttt{/proc/sys/#1}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % /proc/sys file name
+
\newcommand{\sysctlrelfile}[2]{%
\index{file!file di controllo (sotto \texttt{/proc/sys})!{#1/#2}@{{\tt {#1/#2}}}}\texttt{#2}%
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
chiamando \funcm{sysv\_signal}, una volta che si sia definita la macro
\macro{\_XOPEN\_SOURCE}. In generale, per evitare questi problemi, l'uso di
\func{signal}, che tra l'altro ha un comportamento indefinito in caso di
-processo \itindex{thread} multi-\textit{thread}, è da evitare: tutti i nuovi
-programmi devono usare \func{sigaction}.
+processo multi-\textit{thread}, è da evitare: tutti i nuovi programmi devono
+usare \func{sigaction}.
È da tenere presente che, seguendo lo standard POSIX, il comportamento di un
processo che ignora i segnali \signal{SIGFPE}, \signal{SIGILL}, o
queste funzioni era limitata dalla frequenza del timer di sistema, determinato
dal valore della costante \texttt{HZ} di cui abbiamo già parlato in
sez.~\ref{sec:proc_hierarchy}, in quanto le temporizzazioni erano calcolate in
-numero di interruzioni del timer (i cosiddetti \itindex{jiffies}
-``\textit{jiffies}''), ed era assicurato soltanto che il segnale non sarebbe
-stato mai generato prima della scadenza programmata (l'arrotondamento cioè era
-effettuato per eccesso).\footnote{questo in realtà non è del tutto vero a
- causa di un bug, presente fino al kernel 2.6.12, che in certe circostanze
- causava l'emissione del segnale con un arrotondamento per difetto.}
-
-L'uso del contatore dei \itindex{jiffies} \textit{jiffies}, un intero a 32 bit
-nella maggior parte dei casi, comportava inoltre l'impossibilità di
-specificare tempi molto lunghi. superiori al valore della costante
-\const{MAX\_SEC\_IN\_JIFFIES}, pari, nel caso di default di un valore di
-\const{HZ} di 250, a circa 99 giorni e mezzo. Con il cambiamento della
-rappresentazione effettuato nel kernel 2.6.16 questo problema è scomparso e
-con l'introduzione dei timer ad alta risoluzione (vedi
-sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la precisione è diventata
-quella fornita dall'hardware disponibile.
+numero di interruzioni del timer (i cosiddetti ``\textit{jiffies}''), ed era
+assicurato soltanto che il segnale non sarebbe stato mai generato prima della
+scadenza programmata (l'arrotondamento cioè era effettuato per
+eccesso).\footnote{questo in realtà non è del tutto vero a causa di un bug,
+ presente fino al kernel 2.6.12, che in certe circostanze causava l'emissione
+ del segnale con un arrotondamento per difetto.}
+
+L'uso del contatore dei \textit{jiffies}, un intero a 32 bit nella maggior
+parte dei casi, comportava inoltre l'impossibilità di specificare tempi molto
+lunghi. superiori al valore della costante \const{MAX\_SEC\_IN\_JIFFIES},
+pari, nel caso di default di un valore di \const{HZ} di 250, a circa 99 giorni
+e mezzo. Con il cambiamento della rappresentazione effettuato nel kernel
+2.6.16 questo problema è scomparso e con l'introduzione dei timer ad alta
+risoluzione (vedi sez.~\ref{sec:sig_timer_adv}) nel kernel 2.6.21 la
+precisione è diventata quella fornita dall'hardware disponibile.
Una seconda causa di potenziali ritardi è che il segnale viene generato alla
scadenza del timer, ma poi deve essere consegnato al processo; se quest'ultimo
stato consegnato. In questo caso, per il comportamento dei segnali descritto
in sez.~\ref{sec:sig_sigchld}, un solo segnale sarà consegnato. Per questo
oggi l'uso di questa funzione è deprecato a favore degli
-\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} e della
-cosiddetta \itindex{POSIX~Timer~API} \textit{POSIX Timer API}, che tratteremo
-in sez.~\ref{sec:sig_timer_adv}.
+\textit{high-resolution timer} e della cosiddetta \itindex{POSIX~Timer~API}
+\textit{POSIX Timer API}, che tratteremo in sez.~\ref{sec:sig_timer_adv}.
Dato che sia \func{alarm} che \func{setitimer} non consentono di leggere il
valore corrente di un timer senza modificarlo, è possibile usare la funzione
Lo standard POSIX.1b definisce inoltre delle nuove funzioni di sistema che
permettono di gestire l'attesa di segnali specifici su una coda, esse servono
-in particolar modo nel caso dei \itindex{thread} \textit{thread}, in cui si
-possono usare i segnali \textit{real-time} come meccanismi di comunicazione
-elementare; la prima di queste è \funcd{sigwait}, il cui prototipo è:
+in particolar modo nel caso dei \textit{thread}, in cui si possono usare i
+segnali \textit{real-time} come meccanismi di comunicazione elementare; la
+prima di queste è \funcd{sigwait}, il cui prototipo è:
\begin{funcproto}{
\fhead{signal.h}
prevedibile.
Lo standard POSIX.1b definisce altre due funzioni di sistema, anch'esse usate
-prevalentemente con i \itindex{thread} \textit{thread}; \funcd{sigwaitinfo} e
+prevalentemente con i \textit{thread}; \funcd{sigwaitinfo} e
\funcd{sigtimedwait}, i relativi prototipi sono:
\begin{funcproto}{
sez.~\ref{sec:proc_hierarchy}, è data dal valore della costante \texttt{HZ}.
I contatori usati per il calcolo dei tempi infatti erano basati sul numero di
-\itindex{jiffies} \textit{jiffies} che vengono incrementati ad ogni
-\textit{clock tick} del timer di sistema, il che comportava anche, come
-accennato in sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per
-il massimo periodo di tempo copribile da alcuni di questi orologi, come quelli
-associati al \textit{process time} almeno fino a quando, con il kernel 2.6.16,
-non è stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}.
+\textit{jiffies} che vengono incrementati ad ogni \textit{clock tick} del
+timer di sistema, il che comportava anche, come accennato in
+sez.~\ref{sec:sig_alarm_abort} per \func{setitimer}, problemi per il massimo
+periodo di tempo copribile da alcuni di questi orologi, come quelli associati
+al \textit{process time} almeno fino a quando, con il kernel 2.6.16, non è
+stato rimosso il limite di un valore a 32 bit per i \textit{jiffies}.
\itindbeg{POSIX~Timer~API}
sez.~\ref{sec:sys_cpu_times}, nel totale di
\textit{system time} e \textit{user time})
comprensivo di tutto il tempo di CPU usato
- da eventuali \itindex{thread}
- \textit{thread}.\\
+ da eventuali \textit{thread}.\\
\const{CLOCK\_THREAD\_CPUTIME\_ID}& Contatore del tempo di CPU
(\textit{user time} e \textit{system time})
- usato da un singolo \itindex{thread}
- \textit{thread}.\\
+ usato da un singolo \textit{thread}.\\
\hline
\const{CLOCK\_MONOTONIC\_RAW}&Simile al precedente, ma non subisce gli
aggiustamenti dovuti all'uso di NTP (viene
è in fig.~\ref{fig:sig_sigval}) come valore del
campo \var{si\_value} di \struct{siginfo\_t}.\\
\const{SIGEV\_THREAD} & La notifica viene effettuata creando un nuovo
- \itindex{thread} \textit{thread} che esegue la
- funzione di notifica specificata da
+ \textit{thread} che esegue la funzione di
+ notifica specificata da
\var{sigev\_notify\_function} con argomento
\var{sigev\_value}. Se questo è diverso da
\val{NULL}, il \textit{thread} viene creato con
i propri risultati. La funzione infatti è rientrante, ed alloca autonomamente
tutta la memoria necessaria in cui verranno riportati i risultati della
risoluzione. La funzione scriverà all'indirizzo puntato da \param{res} il
-puntatore iniziale ad una \itindex{linked~list} \textit{linked list} di
-strutture di tipo \struct{addrinfo} contenenti tutte le informazioni ottenute.
+puntatore iniziale ad una \textit{linked list} di strutture di tipo
+\struct{addrinfo} contenenti tutte le informazioni ottenute.
\begin{figure}[!htb]
\footnotesize \centering
\begin{figure}[!htb]
\centering
\includegraphics[width=10cm]{img/addrinfo_list}
- \caption{La \itindex{linked~list} \textit{linked list} delle strutture
- \struct{addrinfo} restituite da \func{getaddrinfo}.}
+ \caption{La \textit{linked list} delle strutture \struct{addrinfo}
+ restituite da \func{getaddrinfo}.}
\label{fig:sock_addrinfo_list}
\end{figure}
\end{Verbatim}
%$
-Una volta estratti i risultati dalla \itindex{linked~list} \textit{linked list}
-puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
-di disallocare opportunamente tutta la memoria, per questo viene fornita
+Una volta estratti i risultati dalla \textit{linked list} puntata
+da \param{res} se questa non viene più utilizzata si dovrà avere cura di
+disallocare opportunamente tutta la memoria, per questo viene fornita
l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
\begin{functions}
\headdecl{netdb.h}
\const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
processo in contemporanea.\\
\const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
- \itindex{timezone} \textit{timezone} (vedi
+ \textit{timezone} (vedi
sez.~\ref{sec:sys_time_base})).\\
\const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
processo (vedi sez.~\ref{sec:proc_access_id}).\\
\const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
processo in contemporanea.\\
\const{\_POSIX\_TZNAME\_MAX} & 6& Dimensione massima del nome di una
- \itindex{timezone} \textit{timezone}
+ \textit{timezone}
(vedi sez.~\ref{sec:sys_date}). \\
\const{\_POSIX\_RTSIG\_MAX} & 8& Numero massimo di segnali
\textit{real-time} (vedi
che specifica la macro {FOPEN\_MAX}.\\
\texttt{\_SC\_TZNAME\_MAX}& \const{TZNAME\_MAX}&
La dimensione massima di un nome di una
- \itindex{timezone} \texttt{timezone} (vedi
+ \texttt{timezone} (vedi
sez.~\ref{sec:sys_date}).\\
\texttt{\_SC\_NGROUPS\_MAX}&\const{NGROUP\_MAX}&
Massimo numero di gruppi supplementari che
all'interno di una stessa organizzazione, in modo da mantenere coerenti i
dati, ha portato anche alla necessità di poter recuperare e memorizzare dette
informazioni su supporti diversi dai file citati, introducendo il sistema del
-\itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} (che
-tratteremo brevemente in sez.~\ref{sec:sock_resolver}) dato che la sua
-applicazione è cruciale nella procedura di risoluzione di nomi di rete.
+\textit{Name Service Switch} (che tratteremo brevemente in
+sez.~\ref{sec:sock_resolver}) dato che la sua applicazione è cruciale nella
+procedura di risoluzione di nomi di rete.
In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche
per la lettura delle informazioni relative a utenti e gruppi tralasciando
interrotto da un processo a priorità maggiore. I campi \var{ru\_inblock} e
\var{ru\_oublock} indicano invece il numero di volte che è stata eseguita una
attività di I/O su un filesystem (rispettivamente in lettura e scrittura) ed
-infine \var{ru\_maxrss} indica il valore più alto della
-\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size} raggiunto dal
-processo stesso o, nel caso sia stato usato \const{RUSAGE\_CHILDREN}, da uno
-dei suoi figli.
+infine \var{ru\_maxrss} indica il valore più alto della \textit{Resident Set
+ Size} raggiunto dal processo stesso o, nel caso sia stato usato
+\const{RUSAGE\_CHILDREN}, da uno dei suoi figli.
Si tenga conto che per un errore di implementazione nei i kernel precedenti il
2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1,
con un errore di \errcode{EFBIG}.
\item[\const{RLIMIT\_LOCKS}] Questa risorsa indica il numero massimo di
- \itindex{file~locking} \textit{file lock} (vedi sez.~\ref{sec:file_locking})
- e di \textit{file lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un
- processo poteva effettuare. È un limite presente solo nelle prime versioni
- del kernel 2.4, pertanto non deve essere più utilizzato.
+ \textit{file lock} (vedi sez.~\ref{sec:file_locking}) e di \textit{file
+ lease} (vedi sez.~\ref{sec:file_asyncronous_lease}) che un processo poteva
+ effettuare. È un limite presente solo nelle prime versioni del kernel 2.4,
+ pertanto non deve essere più utilizzato.
\item[\const{RLIMIT\_MEMLOCK}] Questa risorsa indica, in byte, l'ammontare
massimo di memoria che può essere bloccata in RAM da un processo (vedi
\label{sec:sys_unix_time}
\itindbeg{calendar~time}
+\itindbeg{process~time}
Tradizionalmente nei sistemi unix-like sono sempre stati previsti due tipi
distinti di tempi, caratterizzati da altrettante modalità di misura ed
tradizionalmente misurato in secondi a partire dalla mezzanotte del
primo gennaio 1970, data che viene chiamata \textit{the Epoch}.
-\item[\textit{process time}] \itindex{process~time} detto anche \textsl{tempo
- di processore} o \textsl{tempo di CPU}. Si tratta del tempo impiegato da
- un processore nell'esecuzione del codice di un programma all'interno di un
- processo. Per esprimere questo tempo è stato riservato il tipo
- \type{clock\_t}, e viene misurato nei cosiddetti \itindex{clock~tick}
- \textit{clock tick}, tradizionalmente corrispondenti al numero di
- interruzioni del processore da parte del timer di sistema. A differenza del
- precedente indica soltanto un intervallo di durata.
+\item[\textit{process time}] detto anche \textsl{tempo di processore} o
+ \textsl{tempo di CPU}. Si tratta del tempo impiegato da un processore
+ nell'esecuzione del codice di un programma all'interno di un processo. Per
+ esprimere questo tempo è stato riservato il tipo \type{clock\_t}, e viene
+ misurato nei cosiddetti \textit{clock tick}, tradizionalmente corrispondenti
+ al numero di interruzioni del processore da parte del timer di sistema. A
+ differenza del precedente indica soltanto un intervallo di durata.
\end{basedescript}
Il \textit{calendar time} viene sempre mantenuto facendo riferimento
\itindend{calendar~time}
-Il \itindex{process~time} \textit{process time} invece indica sempre una
-misura di un lasso di tempo e viene usato per tenere conto dei tempi di
-esecuzione dei processi. Esso viene sempre diviso in \textit{user time} e
-\textit{system time}, per misurare la durata di ciascun processo il kernel
-infatti calcola tre tempi:
+Il \textit{process time} invece indica sempre una misura di un lasso di tempo
+e viene usato per tenere conto dei tempi di esecuzione dei processi. Esso
+viene sempre diviso in \textit{user time} e \textit{system time}, per misurare
+la durata di ciascun processo il kernel infatti calcola tre tempi:
\begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
\item[\textit{clock time}] il tempo \textsl{reale}, viene chiamato anche
\textit{wall clock time} o \textit{elapsed time}, passato dall'avvio del
esegue un qualsiasi programma lanciando quest'ultimo come argomento del
comando \cmd{time}.
+\itindend{process~time}
\itindbeg{clock~tick}
Come accennato il \textit{process time} viene misurato nei cosiddetti
usato.
\constbeg{HZ}
+
In realtà tutti calcoli dei tempi vengono effettuati dal kernel per il
cosiddetto \textit{software clock}, utilizzando il \textit{timer di sistema} e
facendo i conti in base al numero delle interruzioni generate dello stesso, i
Fino al kernel 2.6.21 la durata di un \textit{jiffy} costituiva la risoluzione
massima ottenibile nella misura dei tempi impiegabile in una \textit{system
call} (ad esempio per i timeout). Con il 2.6.21 e l'introduzione degli
-\itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timers} (HRT) è
-divenuto possibile ottenere, per le funzioni di attesa ed i timer, la massima
-risoluzione possibile fornita dall'hardware. Torneremo su questo in
-sez.~\ref{sec:sig_timer_adv}.
+\textit{high-resolution timers} (HRT) è divenuto possibile ottenere, per le
+funzioni di attesa ed i timer, la massima risoluzione possibile fornita
+dall'hardware. Torneremo su questo in sez.~\ref{sec:sig_timer_adv}.
\itindend{clock~tick}
\subsection{La gestione del \textit{process time}}
\label{sec:sys_cpu_times}
-\itindbeg{process~time}
-
Di norma tutte le operazioni del sistema fanno sempre riferimento al
\textit{calendar time}, l'uso del \textit{process time} è riservato a
quei casi in cui serve conoscere i tempi di esecuzione di un processo
primi 41 secondi) e se il valore del contatore eccede le dimensione del tipo
\type{clock\_t}.
-\itindend{process~time}
-
\subsection{Le funzioni per il \textit{calendar time}}
\label{sec:sys_time_base}
che continua a valere per qualunque funzione che vada a modificare l'orologio
di sistema, comprese tutte quelle che tratteremo in seguito.
+\itindbeg{timezone}
+
Il secondo argomento di entrambe le funzioni è una struttura
\struct{timezone}, che storicamente veniva utilizzata per specificare appunto
-la \itindex{timezone} \textit{timezone}, cioè l'insieme del fuso orario e
-delle convenzioni per l'ora legale che permettevano il passaggio dal tempo
+la cosiddetta \textit{timezone}, cioè l'insieme del fuso orario e delle
+convenzioni per l'ora legale che permettevano il passaggio dal tempo
universale all'ora locale. Questo argomento oggi è obsoleto ed in Linux non è
mai stato utilizzato; esso non è supportato né dalle vecchie \textsl{libc5},
né dalle \textsl{glibc}: pertanto quando si chiama questa funzione deve essere
sempre impostato a \val{NULL}.
+\itindbeg{timezone}
+
Modificare l'orologio di sistema con queste funzioni è comunque problematico,
in quanto esse effettuano un cambiamento immediato. Questo può creare dei
buchi o delle ripetizioni nello scorrere dell'orologio di sistema, con
\code{ADJ}.
Si tenga presente infine che con l'introduzione a partire dal kernel 2.6.21
-degli \itindex{High~Resolution~Timer~(HRT)} \textit{high-resolution timer} ed
-il supporto per i cosiddetti POSIX \textit{real-time clock}, si può ottenere
-il \textit{calendar time} direttamente da questi, come vedremo in
-sez.~\ref{sec:sig_timer_adv}, con la massima risoluzione possibile per
-l'hardware della macchina.
+degli \textit{high-resolution timer} ed il supporto per i cosiddetti POSIX
+\textit{real-time clock}, si può ottenere il \textit{calendar time}
+direttamente da questi, come vedremo in sez.~\ref{sec:sig_timer_adv}, con la
+massima risoluzione possibile per l'hardware della macchina.
\end{Example}
Nel caso di \func{ctime} la funzione tiene conto della eventuale impostazione
-di una \itindex{timezone} \textit{timezone} e effettua una chiamata preventiva
-a \func{tzset} (che vedremo a breve), in modo che la data espressa tenga conto
-del fuso orario. In realtà \func{ctime} è banalmente definita in termini di
+di una \textit{timezone} e effettua una chiamata preventiva a \func{tzset}
+(che vedremo a breve), in modo che la data espressa tenga conto del fuso
+orario. In realtà \func{ctime} è banalmente definita in termini di
\func{asctime} come \code{asctime(localtime(t)}.
Dato che l'uso di una stringa statica rende le funzioni non rientranti
\includestruct{listati/time_zone_var.c}
\end{minipage}
\normalsize
- \caption{Le variabili globali usate per la gestione delle \itindex{timezone}
+ \caption{Le variabili globali usate per la gestione delle
\textit{timezone}.}
\label{fig:sys_tzname}
\end{figure}
Come accennato l'uso del \textit{broken-down time} permette di tenere conto
anche della differenza fra tempo universale e ora locale, compresa l'eventuale
ora legale. Questo viene fatto dalle funzioni di conversione grazie alle
-informazioni riguardo la propria \itindex{timezone} \textit{timezone}
-mantenute nelle tre variabili globali mostrate in fig.~\ref{fig:sys_tzname},
-cui si si può accedere direttamente includendo \headfile{time.h}. Come
-illustrato queste variabili vengono impostate internamente da alcune delle
-delle precedenti funzioni di conversione, ma lo si può fare esplicitamente
-chiamando direttamente la funzione \funcd{tzset}, il cui prototipo è:
+informazioni riguardo la propria \textit{timezone} mantenute nelle tre
+variabili globali mostrate in fig.~\ref{fig:sys_tzname}, cui si si può
+accedere direttamente includendo \headfile{time.h}. Come illustrato queste
+variabili vengono impostate internamente da alcune delle delle precedenti
+funzioni di conversione, ma lo si può fare esplicitamente chiamando
+direttamente la funzione \funcd{tzset}, il cui prototipo è:
\begin{funcproto}{
\fhead{time.h}
dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è
definita verrà usato il file \conffiled{/etc/localtime}. La variabile
\var{tzname} contiene due stringhe, che indicano i due nomi standard della
-\itindex{timezone} \textit{timezone} corrente. La prima è il nome per l'ora
-solare, la seconda per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname}
-sono indicate come \code{char *} non è il caso di modificare queste
-stringhe. La variabile \var{timezone} indica la differenza di fuso orario in
-secondi, mentre \var{daylight} indica se è attiva o meno l'ora legale.
+\textit{timezone} corrente. La prima è il nome per l'ora solare, la seconda
+per l'ora legale. Anche se in fig.~\ref{fig:sys_tzname} sono indicate come
+\code{char *} non è il caso di modificare queste stringhe. La variabile
+\var{timezone} indica la differenza di fuso orario in secondi, mentre
+\var{daylight} indica se è attiva o meno l'ora legale.
Benché la funzione \func{asctime} fornisca la modalità più immediata per
stampare un tempo o una data, la flessibilità non fa parte delle sue
\var{\%X}&\texttt{18:40:50} & L'ora.\\
\var{\%y}&\texttt{02} & Anno nel secolo.\\
\var{\%Y}&\texttt{2002} & Anno.\\
- \var{\%Z}&\texttt{CEST} & Nome della \itindex{timezone}
- \textit{timezone}.\\
+ \var{\%Z}&\texttt{CEST} & Nome della \textit{timezone}.\\
\var{\%\%}&\texttt{\%} & Il carattere \%.\\
\hline
\end{tabular}
semplicemente usando un opportuno valore di ritorno della funzione invocata.
Inoltre il sistema di classificazione degli errori è stato progettato
sull'architettura a processi, e presenta una serie di problemi nel caso lo si
-debba usare con i \itindex{thread} \textit{thread}.
+debba usare con i \textit{thread}.
\subsection{La variabile \var{errno}}
Per riportare il tipo di errore il sistema usa la variabile globale
\var{errno}, definita nell'header \headfile{errno.h}. Come accennato l'uso di
-una variabile globale può comportare problemi nel caso dei \itindex{thread}
-\textit{thread}, ma lo standard ISO C consente anche di definire \var{errno}
-come un cosiddetto ``\textit{modifiable lvalue}'', cosa che consente di usare
-anche una macro, e questo è infatti il metodo usato da Linux per renderla
-locale ai singoli \itindex{thread} \textit{thread}.
+una variabile globale può comportare problemi nel caso dei \textit{thread}, ma
+lo standard ISO C consente anche di definire \var{errno} come un cosiddetto
+``\textit{modifiable lvalue}'', cosa che consente di usare anche una macro, e
+questo è infatti il metodo usato da Linux per renderla locale ai singoli
+\textit{thread}.
La variabile è in genere definita come \dirct{volatile} dato che può essere
cambiata in modo asincrono da un segnale, per un esempio si veda
modificata dal programma; essa è utilizzabile solo fino ad una chiamata
successiva a \func{strerror} o \func{perror} e nessun'altra funzione di
libreria tocca questa stringa. In ogni caso l'uso di una stringa statica rende
-la funzione non rientrante, per cui nel caso si usino i \itindex{thread}
-\textit{thread} la \acr{glibc} fornisce una apposita versione rientrante
-\funcd{strerror\_r}, il cui prototipo è:
+la funzione non rientrante, per cui nel caso si usino i \textit{thread} la
+\acr{glibc} fornisce una apposita versione rientrante \funcd{strerror\_r}, il
+cui prototipo è:
\begin{funcproto}{
\fhead{string.h}
le quali si rimanda alla lettura della pagina di manuale).
La funzione è analoga a \func{strerror} ma restituisce la stringa di errore
-nel buffer \param{buf} che il singolo \itindex{thread} \textit{thread} deve
-allocare autonomamente per evitare i problemi connessi alla condivisione del
-buffer statico. Il messaggio è copiato fino alla dimensione massima del
-buffer, specificata dall'argomento \param{size}, che deve comprendere pure il
+nel buffer \param{buf} che il singolo \textit{thread} deve allocare
+autonomamente per evitare i problemi connessi alla condivisione del buffer
+statico. Il messaggio è copiato fino alla dimensione massima del buffer,
+specificata dall'argomento \param{size}, che deve comprendere pure il
carattere di terminazione; altrimenti la stringa risulterà troncata.
Una seconda funzione usata per riportare i codici di errore in maniera