ed è utile per riconoscere la chiusura di una connessione dall'altro capo di
un socket quando si lavora in modalità \textit{edge triggered}.}
-Il secondo campo, \var{data}, è una \direct{union} che serve a identificare il
+Il secondo campo, \var{data}, è una \dirct{union} che serve a identificare il
file descriptor a cui si intende fare riferimento, ed in astratto può
contenere un valore qualsiasi (specificabile in diverse forme) che ne permetta
una indicazione univoca. Il modo più comune di usarlo però è quello in cui si
Infine due campi \var{name} e \var{len} sono utilizzati soltanto quando
l'evento è relativo ad un file presente in una directory posta sotto
osservazione, in tal caso essi contengono rispettivamente il nome del file
-(come \itindsub{pathname}{relativo} \textit{pathname} relativo alla directory
-osservata) e la relativa dimensione in byte. Il campo \var{name} viene sempre
-restituito come stringa terminata da NUL, con uno o più zeri di terminazione,
-a seconda di eventuali necessità di allineamento del risultato, ed il valore
-di \var{len} corrisponde al totale della dimensione di \var{name}, zeri
-aggiuntivi compresi. La stringa con il nome del file viene restituita nella
-lettura subito dopo la struttura \struct{inotify\_event}; questo significa che
-le dimensioni di ciascun evento di \textit{inotify} saranno pari a
-\code{sizeof(\struct{inotify\_event}) + len}.
+(come \textit{pathname} relativo alla directory osservata) e la relativa
+dimensione in byte. Il campo \var{name} viene sempre restituito come stringa
+terminata da NUL, con uno o più zeri di terminazione, a seconda di eventuali
+necessità di allineamento del risultato, ed il valore di \var{len} corrisponde
+al totale della dimensione di \var{name}, zeri aggiuntivi compresi. La stringa
+con il nome del file viene restituita nella lettura subito dopo la struttura
+\struct{inotify\_event}; questo significa che le dimensioni di ciascun evento
+di \textit{inotify} saranno pari a \code{sizeof(\struct{inotify\_event}) +
+ len}.
Vediamo allora un esempio dell'uso dell'interfaccia di \textit{inotify} con un
semplice programma che permette di mettere sotto osservazione uno o più file e
\begin{figure}[!htb]
\centering
- \includegraphics[width=12cm]{img/disk_struct}
+ \includegraphics[width=11cm]{img/disk_struct}
\caption{Organizzazione dello spazio su un disco in partizioni e
filesystem.}
\label{fig:file_disk_filesys}
\begin{figure}[!htb]
\centering
- \includegraphics[width=12cm]{img/filesys_struct}
+ \includegraphics[width=11cm]{img/filesys_struct}
\caption{Strutturazione dei dati all'interno di un filesystem.}
\label{fig:file_filesys_detail}
\end{figure}
della serie 2.2.x i 16 più significativi avevano un valore riservato che
doveva essere specificato obbligatoriamente,\footnote{il valore era il
\textit{magic number} \code{0xC0ED}, si può usare la costante
- \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
+ \constd{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} riservata
al \textit{magic number}, mentre per specificarlo si può dare un OR
- aritmetico con la costante \const{MS\_MGC\_VAL}.} e si potevano usare solo i
+ aritmetico con la costante \constd{MS\_MGC\_VAL}.} e si potevano usare solo i
16 meno significativi. Oggi invece, con un numero di opzioni superiore, sono
utilizzati tutti e 32 i bit, ma qualora nei 16 più significativi sia presente
detto valore, che non esprime una combinazione valida, esso viene ignorato. Il
\begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}}
\itindbeg{bind~mount}
-\item[\const{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
+\item[\constd{MS\_BIND}] Effettua un cosiddetto \textit{bind mount}, in cui è
possibile montare una directory di un filesystem in un'altra directory,
l'opzione è disponibile a partire dai kernel della serie 2.4. In questo caso
verranno presi in considerazione solo gli argomenti \param{source}, che
\itindend{bind~mount}
-\item[\const{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
+\item[\constd{MS\_DIRSYNC}] Richiede che ogni modifica al contenuto di una
directory venga immediatamente registrata su disco in maniera sincrona
(introdotta a partire dai kernel della serie 2.6). L'opzione si applica a
tutte le directory del filesystem, ma su alcuni filesystem è possibile
operazioni sulle directory non saranno più bufferizzate e si bloccheranno
fino all'arrivo dei dati sul disco prima che un programma possa proseguire.
-\item[\const{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
+\item[\constd{MS\_MANDLOCK}] Consente l'uso del \textit{mandatory locking}
(vedi sez.~\ref{sec:file_mand_locking}) sui file del filesystem. Per poterlo
utilizzare effettivamente però esso dovrà essere comunque attivato
esplicitamente per i singoli file impostando i permessi come illustrato in
sez.~\ref{sec:file_mand_locking}.
-\item[\const{MS\_MOVE}] Effettua uno del spostamento del \textit{mount point}
+\item[\constd{MS\_MOVE}] Effettua uno del spostamento del \textit{mount point}
di un filesystem. La directory del \textit{mount point} originale deve
essere indicata nell'argomento \param{source}, e la sua nuova posizione
nell'argomento \param{target}. Tutti gli altri argomenti della funzione
sotto \param{source} sarà immediatamente visibile sotto \param{target}. Non
esiste cioè nessun momento in cui il filesystem non risulti montato in una o
nell'altra directory e pertanto è garantito che la risoluzione di
- \itindsub{pathname}{relativo} \textit{pathname} relativi all'interno del
- filesystem non possa fallire.
+ \textit{pathname} relativi all'interno del filesystem non possa fallire.
-\item[\const{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
+\item[\constd{MS\_NOATIME}] Viene disabilitato sul filesystem l'aggiornamento
degli \textit{access time} (vedi sez.~\ref{sec:file_file_times}) per
qualunque tipo di file. Dato che l'aggiornamento degli \textit{access time}
è una funzionalità la cui utilità è spesso irrilevante ma comporta un costo
sviluppo del kernel sono state introdotte altre opzioni che forniscono
soluzioni più appropriate e meno radicali.
-\item[\const{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
+\item[\constd{MS\_NODEV}] Viene disabilitato sul filesystem l'accesso ai file
di dispositivo eventualmente presenti su di esso. L'opzione viene usata come
misura di precauzione per rendere inutile la presenza di eventuali file di
dispositivo su filesystem che non dovrebbero contenerne.\footnote{si ricordi
dispositivo con permessi ``opportunamente'' ampliati che gli consentirebbero
di accedere anche a risorse cui non dovrebbe.
-\item[\const{MS\_NODIRATIME}] Viene disabilitato sul filesystem
+\item[\constd{MS\_NODIRATIME}] Viene disabilitato sul filesystem
l'aggiornamento degli \textit{access time} (vedi
sez.~\ref{sec:file_file_times}), ma soltanto per le directory. Costituisce
una alternativa per \const{MS\_NOATIME}, che elimina l'informazione per le
directory, che in pratica che non viene mai utilizzata, mantenendola per i
file in cui invece ha un impiego, sia pur limitato.
-\item[\const{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
+\item[\constd{MS\_NOEXEC}] Viene disabilitata sul filesystem l'esecuzione di un
qualunque file eseguibile eventualmente presente su di esso. L'opzione viene
usata come misura di precauzione per rendere impossibile l'uso di programmi
posti su filesystem che non dovrebbero contenerne.
vuole che gli utenti eseguano solo i programmi forniti
dall'amministratore.}
-\item[\const{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
+\item[\constd{MS\_NOSUID}] Viene disabilitato sul filesystem l'effetto dei bit
dei permessi \acr{suid} e \acr{sgid} (vedi sez.~\ref{sec:file_special_perm})
eventualmente presenti sui file in esso contenuti. L'opzione viene usata
come misura di precauzione per rendere inefficace l'effetto di questi bit
di un altro utente, che gli consentirebbe di eseguirlo per conto di
quest'ultimo.
-\item[\const{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
+\item[\constd{MS\_PRIVATE}] Marca un \textit{mount point} come privato. Si
tratta di una delle nuove opzioni (insieme a \const{MS\_SHARED},
\const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte
dell'infrastruttura degli \textit{shared subtree} introdotta a partire dal
\const{MS\_BIND}. Si usa questo flag principalmente per revocare gli effetti
delle altre opzioni e riportare il comportamento a quello ordinario.
-\item[\const{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
+\item[\constd{MS\_RDONLY}] Esegue il montaggio del filesystem in sola lettura,
non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le
volte che si deve accedere ai contenuti di un filesystem con la certezza che
questo non venga modificato (ad esempio per ispezionare un filesystem
corrotto). All'avvio di default il kernel monta la radice in questa
modalità.
-\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
+\item[\constd{MS\_REC}] Applica ricorsivamente a tutti i \textit{mount point}
presenti al di sotto del \textit{mount point} indicato gli effetti della
opzione degli \textit{shared subtree} associata. Anche questo caso
l'argomento \param{target} deve fare riferimento ad un \textit{mount point}
% TODO trattare l'opzione \texttt{lazytime} introdotta con il kernel 4.0,
% vedi http://lwn.net/Articles/621046/
-\item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
+\item[\constd{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli
\textit{access time} sul filesystem soltanto quando questo risulti
antecedente il valore corrente del \textit{modification time} o del
\textit{change time} (per i tempi dei file si veda
l'introduzione di questo comportamento l'uso delle alternative
\const{MS\_NOATIME} e \const{MS\_NODIRATIME} è sostanzialmente inutile.
-\item[\const{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
+\item[\constd{MS\_REMOUNT}] Consente di rimontare un filesystem già montato
cambiandone le opzioni di montaggio in maniera atomica. In questo modo si
possono modificare le opzioni del filesystem anche se questo è in uso. Gli
argomenti \param{source} e \param{target} devono essere gli stessi usati per
\itindbeg{shared~subtree}
-\item[\const{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
+\item[\constd{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared
mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti
parte dell'infrastruttura dei cosiddetti \textit{shared subtree} introdotta
\itindend{shared~subtree}
-\item[\const{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
+\item[\constd{MS\_SILENT}] Richiede la soppressione di alcuni messaggi di
avvertimento nei log del kernel (vedi sez.~\ref{sec:sess_daemon}). L'opzione
è presente a partire dal kernel 2.6.17 e sostituisce, utilizzando un nome
non fuorviante, la precedente \const{MS\_VERBOSE}, introdotta nel kernel
2.6.12, che aveva lo stesso effetto.
-\item[\const{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
+\item[\constd{MS\_SLAVE}] Marca un \textit{mount point} come \textit{slave
mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_UNBINDABLE}) facenti
parte dell'infrastruttura degli \textit{shared subtree} introdotta a partire
essi potranno eseguire al loro interno ulteriori montaggi che non saranno
propagati né negli altri né nel \textit{mount point} originale.
-\item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
+\item[\constd{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per
cui l'\textit{access time} viene aggiornato ad ogni accesso al
file. L'opzione è disponibile solo a partire dal kernel 2.6.30 quando il
comportamento di default del kernel è diventato quello fornito da
\const{MS\_RELATIME}.
-\item[\const{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
+\item[\constd{MS\_SYNCHRONOUS}] Abilita la scrittura sincrona richiedendo che
ogni modifica al contenuto del filesystem venga immediatamente registrata su
disco. Lo stesso comportamento può essere ottenuto con il flag
\const{O\_SYNC} di \func{open} (vedi sez.~\ref{sec:file_open_close}).
compromesso in cui questo comportamento avviene solo per le directory, ed ha
quindi una incidenza nettamente minore, si può usare \const{MS\_DIRSYNC}.
-\item[\const{MS\_UNBINDABLE}] Marca un \textit{mount point} come
+\item[\constd{MS\_UNBINDABLE}] Marca un \textit{mount point} come
\textit{unbindable mount}. Si tratta di una delle nuove opzioni (insieme a
\const{MS\_PRIVATE}, \const{MS\_SHARED} e \const{MS\_SLAVE}) facenti parte
dell'infrastruttura degli \textit{shared subtree} introdotta a partire dal
Il valore di \param{flags} è una maschera binaria dei flag che controllano le
modalità di smontaggio, che deve essere specificato con un OR aritmetico delle
costanti illustrate in tab.~\ref{tab:umount2_flags}. Specificando
-\const{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
+\constd{MNT\_FORCE} la funzione cercherà di liberare il filesystem anche se è
occupato per via di una delle condizioni descritte in precedenza. A seconda
del tipo di filesystem alcune (o tutte) possono essere superate, evitando
l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio viene
\hline
\hline
\const{MNT\_FORCE} & Forza lo smontaggio del filesystem anche se questo è
- occupato (presente dai kernel della serie 2.2).\\
+ occupato (presente dai kernel della serie 2.2).\\
\const{MNT\_DETACH} & Esegue uno smontaggio ``\textsl{pigro}'', in cui si
- blocca l'accesso ma si aspetta che il filesystem si
- liberi (presente dal kernel 2.4.11 e dalla
- \acr{glibc} 2.11).\\
+ blocca l'accesso ma si aspetta che il filesystem si
+ liberi (presente dal kernel 2.4.11 e dalla
+ \acr{glibc} 2.11).\\
\const{MNT\_EXPIRE} & Se non occupato marca un \textit{mount point} come
- ``\textsl{in scadenza}'' in modo che ad una
- successiva chiamata senza utilizzo del filesystem
- questo venga smontato (presente dal
- kernel 2.6.8 e dalla \acr{glibc} 2.11).\\
+ ``\textsl{in scadenza}'' in modo che ad una
+ successiva chiamata senza utilizzo del filesystem
+ questo venga smontato (presente dal
+ kernel 2.6.8 e dalla \acr{glibc} 2.11).\\
\const{UMOUNT\_NOFOLLOW}& Non dereferenzia \param{target} se questo è un
- collegamento simbolico (vedi
- sez.~\ref{sec:link_symlink_rename}) evitando
- problemi di sicurezza (presente dal kernel 2.6.34).\\
+ collegamento simbolico (vedi
+ sez.~\ref{sec:link_symlink_rename}) evitando
+ problemi di sicurezza (presente dal kernel
+ 2.6.34).\\
\hline
\end{tabular}
\caption{Costanti che identificano i bit dell'argomento \param{flags}
\label{tab:umount2_flags}
\end{table}
-Con l'opzione \const{MNT\_DETACH} si richiede invece uno smontaggio
+Con l'opzione \constd{MNT\_DETACH} si richiede invece uno smontaggio
``\textsl{pigro}'' (o \textit{lazy umount}) in cui il filesystem diventa
inaccessibile per i nuovi processi subito dopo la chiamata della funzione, ma
resta accessibile per quelli che lo hanno ancora in uso e non viene smontato
fintanto che resta occupato.
-Con \const{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
+Con \constd{MNT\_EXPIRE}, che non può essere specificato insieme agli altri
due, si marca il \textit{mount point} di un filesystem non occupato come
``\textsl{in scadenza}'', in tal caso \func{umount2} ritorna con un errore di
\errcode{EAGAIN}, mentre in caso di filesystem occupato si sarebbe ricevuto
automaticamente i filesystem che restano inutilizzati per un certo periodo di
tempo.
-Infine il flag \const{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
+Infine il flag \constd{UMOUNT\_NOFOLLOW} non dereferenzia \param{target} se
questo è un collegamento simbolico (vedi
sez.~\ref{sec:link_symlink_rename}). Questa è una misura di sicurezza
introdotta per evitare, per quei filesystem per il quale è prevista una
\label{fig:sys_statfs}
\end{figure}
+\conffilebeg{/etc/mtab}
La \acr{glibc} provvede infine una serie di funzioni per la gestione dei due
-file \conffile{/etc/fstab}\footnote{più precisamente \funcm{setfsent},
+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},
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)
% TODO (bassa priorità) documentare ? swapon e swapoff (man 2 ...)
Per questo motivo il kernel e le librerie prevedono che nella risoluzione di
un \textit{pathname} possano essere seguiti fino ad un certo numero massimo di
collegamenti simbolici, il cui valore limite è specificato dalla costante
-\const{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
+\constd{MAXSYMLINKS}. Qualora questo limite venga superato viene generato un
errore ed \var{errno} viene impostata al valore \errcode{ELOOP}, che nella
quasi totalità dei casi indica appunto che si è creato un collegamento
simbolico che fa riferimento ad una directory del suo stesso
segnalata dalla definizione di altrettante macro nella forma
\code{\_DIRENT\_HAVE\_D\_XXX} dove \code{XXX} è il nome del relativo
campo. Come si può evincere da fig.~\ref{fig:file_dirent_struct} nel caso di
-Linux sono pertanto definite le macro \macro{\_DIRENT\_HAVE\_D\_TYPE},
-\macro{\_DIRENT\_HAVE\_D\_OFF} e \macro{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
-è definita la macro \macro{\_DIRENT\_HAVE\_D\_NAMLEN}.
+Linux sono pertanto definite le macro \macrod{\_DIRENT\_HAVE\_D\_TYPE},
+\macrod{\_DIRENT\_HAVE\_D\_OFF} e \macrod{\_DIRENT\_HAVE\_D\_RECLEN}, mentre non
+è definita la macro \macrod{\_DIRENT\_HAVE\_D\_NAMLEN}.
Dato che possono essere presenti campi opzionali e che lo standard
POSIX.1-2001 non specifica una dimensione definita per il nome dei file (che
\vspace{3pt}
\begin{funcbox}{
\fhead{stddef.h}
-\fdecl{size\_t \macro{offsetof}(type, member)}
+\fdecl{size\_t \macrod{offsetof}(type, member)}
\fdesc{Restituisce la posizione del campo \param{member} nella
struttura \param{type}.}
}
\textbf{Valore} & \textbf{Tipo di file} \\
\hline
\hline
- \const{DT\_UNKNOWN} & Tipo sconosciuto.\\
- \const{DT\_REG} & File normale.\\
- \const{DT\_DIR} & Directory.\\
- \const{DT\_LNK} & Collegamento simbolico.\\
- \const{DT\_FIFO} & Fifo.\\
- \const{DT\_SOCK} & Socket.\\
- \const{DT\_CHR} & Dispositivo a caratteri.\\
- \const{DT\_BLK} & Dispositivo a blocchi.\\
+ \constd{DT\_UNKNOWN} & Tipo sconosciuto.\\
+ \constd{DT\_REG} & File normale.\\
+ \constd{DT\_DIR} & Directory.\\
+ \constd{DT\_LNK} & Collegamento simbolico.\\
+ \constd{DT\_FIFO} & Fifo.\\
+ \constd{DT\_SOCK} & Socket.\\
+ \constd{DT\_CHR} & Dispositivo a caratteri.\\
+ \constd{DT\_BLK} & Dispositivo a blocchi.\\
\hline
\end{tabular}
\caption{Costanti che indicano i vari tipi di file nel campo \var{d\_type}
\vspace{3pt}
\begin{funcbox}{
\fhead{dirent.h}
-\fdecl{int \macro{IFTODT}(mode\_t MODE)}
+\fdecl{int \macrod{IFTODT}(mode\_t MODE)}
\fdesc{Converte il tipo di file dal formato di \var{st\_mode} a quello di
\var{d\_type}.}
-\fdecl{mode\_t \macro{DTTOIF}(int DTYPE)}
+\fdecl{mode\_t \macrod{DTTOIF}(int DTYPE)}
\fdesc{Converte il tipo di file dal formato di \var{d\_type} a quello di
\var{st\_mode}.}
}
precisamente nel campo \texttt{pwd} della sotto-struttura
\kstruct{fs\_struct}.} che è chiamata \textsl{directory corrente} o
\textsl{directory di lavoro} (in inglese \textit{current working directory}).
-La directory di lavoro è quella da cui si parte quando un
-\itindsub{pathname}{relativo} \textit{pathname} è espresso in forma relativa,
-dove il ``\textsl{relativa}'' fa riferimento appunto a questa directory.
+La directory di lavoro è quella da cui si parte quando un \textit{pathname} è
+espresso in forma relativa, dove il ``\textsl{relativa}'' fa riferimento
+appunto a questa directory.
Quando un utente effettua il login, questa directory viene impostata alla
\textit{home directory} del suo account. Il comando \cmd{cd} della shell
Le macro sono definite nel file \headfile{sys/sysmacros.h},\footnote{se si usa
la \acr{glibc} dalla versione 2.3.3 queste macro sono degli alias alle
- versioni specifiche di questa libreria, \macro{gnu\_dev\_major},
- \macro{gnu\_dev\_minor} e \macro{gnu\_dev\_makedev} che si possono usare
+ versioni specifiche di questa libreria, \macrod{gnu\_dev\_major},
+ \macrod{gnu\_dev\_minor} e \macrod{gnu\_dev\_makedev} che si possono usare
direttamente, al costo di una minore portabilità.} che viene automaticamente
incluso quando si include \headfile{sys/types.h}. Si possono pertanto ottenere
i valori del \textit{major number} e \textit{minor number} di un dispositivo
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/types.h}
-\fdecl{int \macro{major}(dev\_t dev)}
+\fdecl{int \macrod{major}(dev\_t dev)}
\fdesc{Restituisce il \textit{major number} del dispositivo \param{dev}.}
-\fdecl{int \macro{minor}(dev\_t dev)}
+\fdecl{int \macrod{minor}(dev\_t dev)}
\fdesc{Restituisce il \textit{minor number} del dispositivo \param{dev}.}
}
\end{funcbox}
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/types.h}
-\fdecl{dev\_t \macro{makedev}(int major, int minor)}
+\fdecl{dev\_t \macrod{makedev}(int major, int minor)}
\fdesc{Dati \textit{major number} e \textit{minor number} restituisce
l'identificativo di un dispositivo.}
}
La funzione restituisce il puntatore ad una stringa contente un nome di file
valido e non esistente al momento dell'invocazione. Se si è passato come
argomento \param{string} un puntatore non nullo ad un buffer di caratteri
-questo deve essere di dimensione \const{L\_tmpnam} ed il nome generato vi
+questo deve essere di dimensione \constd{L\_tmpnam} ed il nome generato vi
verrà copiato automaticamente, altrimenti il nome sarà generato in un buffer
statico interno che verrà sovrascritto ad una chiamata successiva. Successive
invocazioni della funzione continueranno a restituire nomi unici fino ad un
-massimo di \const{TMP\_MAX} volte, limite oltre il quale il comportamento è
+massimo di \constd{TMP\_MAX} volte, limite oltre il quale il comportamento è
indefinito. Al nome viene automaticamente aggiunto come prefisso la directory
-specificata dalla costante \const{P\_tmpdir}.\footnote{le costanti
+specificata dalla costante \constd{P\_tmpdir}.\footnote{le costanti
\const{L\_tmpnam}, \const{P\_tmpdir} e \const{TMP\_MAX} sono definite in
\headfile{stdio.h}.}
-Di questa funzione esiste una versione \ rientrante,
-\funcm{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento.
-Una funzione simile, \funcd{tempnam}, permette di specificare un prefisso per
-il file esplicitamente, il suo prototipo è:
+Di questa funzione esiste una versione rientrante, \funcm{tmpnam\_r}, che non
+fa nulla quando si passa \val{NULL} come argomento. Una funzione simile,
+\funcd{tempnam}, permette di specificare un prefisso per il file
+esplicitamente, il suo prototipo è:
\begin{funcproto}{
\fhead{stdio.h}
\end{funcproto}
La funzione alloca con \code{malloc} la stringa in cui restituisce il nome,
-per cui è sempre \ rientrante, occorre però
-ricordarsi di disallocare con \code{free} il puntatore che restituisce.
-L'argomento \param{pfx} specifica un prefisso di massimo 5 caratteri per il
-nome provvisorio. La funzione assegna come directory per il file temporaneo,
-verificando che esista e sia accessibile, la prima valida fra le seguenti:
+per cui è sempre rientrante, occorre però ricordarsi di disallocare con
+\code{free} il puntatore che restituisce. L'argomento \param{pfx} specifica
+un prefisso di massimo 5 caratteri per il nome provvisorio. La funzione
+assegna come directory per il file temporaneo, verificando che esista e sia
+accessibile, la prima valida fra le seguenti:
\begin{itemize*}
\item la variabile di ambiente \envvar{TMPDIR} (non ha effetto se non è
definita o se il programma chiamante è \acr{suid} o \acr{sgid}, vedi
\textbf{Macro} & \textbf{Tipo del file} \\
\hline
\hline
- \macro{S\_ISREG}\texttt{(m)} & File normale.\\
- \macro{S\_ISDIR}\texttt{(m)} & Directory.\\
- \macro{S\_ISCHR}\texttt{(m)} & Dispositivo a caratteri.\\
- \macro{S\_ISBLK}\texttt{(m)} & Dispositivo a blocchi.\\
- \macro{S\_ISFIFO}\texttt{(m)} & Fifo.\\
- \macro{S\_ISLNK}\texttt{(m)} & Collegamento simbolico.\\
- \macro{S\_ISSOCK}\texttt{(m)} & Socket.\\
+ \macrod{S\_ISREG}\texttt{(m)} & File normale.\\
+ \macrod{S\_ISDIR}\texttt{(m)} & Directory.\\
+ \macrod{S\_ISCHR}\texttt{(m)} & Dispositivo a caratteri.\\
+ \macrod{S\_ISBLK}\texttt{(m)} & Dispositivo a blocchi.\\
+ \macrod{S\_ISFIFO}\texttt{(m)} & Fifo.\\
+ \macrod{S\_ISLNK}\texttt{(m)} & Collegamento simbolico.\\
+ \macrod{S\_ISSOCK}\texttt{(m)} & Socket.\\
\hline
\end{tabular}
\caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).}
\textbf{Flag} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\
- \const{S\_IFSOCK} & 0140000 & Socket.\\
- \const{S\_IFLNK} & 0120000 & Collegamento simbolico.\\
- \const{S\_IFREG} & 0100000 & File regolare.\\
- \const{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\
- \const{S\_IFDIR} & 0040000 & Directory.\\
- \const{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\
- \const{S\_IFIFO} & 0010000 & Fifo.\\
+ \constd{S\_IFMT} & 0170000 & Maschera per i bit del tipo di file.\\
+ \constd{S\_IFSOCK} & 0140000 & Socket.\\
+ \constd{S\_IFLNK} & 0120000 & Collegamento simbolico.\\
+ \constd{S\_IFREG} & 0100000 & File regolare.\\
+ \constd{S\_IFBLK} & 0060000 & Dispositivo a blocchi.\\
+ \constd{S\_IFDIR} & 0040000 & Directory.\\
+ \constd{S\_IFCHR} & 0020000 & Dispositivo a caratteri.\\
+ \constd{S\_IFIFO} & 0010000 & Fifo.\\
\hline
- \const{S\_ISUID} & 0004000 & Set user ID (\acr{suid}) bit, vedi
+ \constd{S\_ISUID} & 0004000 & Set user ID (\acr{suid}) bit, vedi
sez.~\ref{sec:file_special_perm}).\\
- \const{S\_ISGID} & 0002000 & Set group ID (\acr{sgid}) bit, vedi
+ \constd{S\_ISGID} & 0002000 & Set group ID (\acr{sgid}) bit, vedi
sez.~\ref{sec:file_special_perm}).\\
- \const{S\_ISVTX} & 0001000 & \acr{Sticky} bit, vedi
+ \constd{S\_ISVTX} & 0001000 & \acr{Sticky} bit, vedi
sez.~\ref{sec:file_special_perm}).\\
\hline
- \const{S\_IRWXU} & 00700 & Maschera per i permessi del proprietario.\\
- \const{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\
- \const{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\
- \const{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\
+ \constd{S\_IRWXU} & 00700 & Maschera per i permessi del proprietario.\\
+ \constd{S\_IRUSR} & 00400 & Il proprietario ha permesso di lettura.\\
+ \constd{S\_IWUSR} & 00200 & Il proprietario ha permesso di scrittura.\\
+ \constd{S\_IXUSR} & 00100 & Il proprietario ha permesso di esecuzione.\\
\hline
- \const{S\_IRWXG} & 00070 & Maschera per i permessi del gruppo.\\
- \const{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\
- \const{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\
- \const{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\
+ \constd{S\_IRWXG} & 00070 & Maschera per i permessi del gruppo.\\
+ \constd{S\_IRGRP} & 00040 & Il gruppo ha permesso di lettura.\\
+ \constd{S\_IWGRP} & 00020 & Il gruppo ha permesso di scrittura.\\
+ \constd{S\_IXGRP} & 00010 & Il gruppo ha permesso di esecuzione.\\
\hline
- \const{S\_IRWXO} & 00007 & Maschera per i permessi di tutti gli altri\\
- \const{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\
- \const{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\
- \const{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\
+ \constd{S\_IRWXO} & 00007 & Maschera per i permessi di tutti gli altri\\
+ \constd{S\_IROTH} & 00004 & Gli altri hanno permesso di lettura.\\
+ \constd{S\_IWOTH} & 00002 & Gli altri hanno permesso di esecuzione.\\
+ \constd{S\_IXOTH} & 00001 & Gli altri hanno permesso di esecuzione.\\
\hline
\end{tabular}
\caption{Costanti per l'identificazione dei vari bit che compongono il campo
il valore \val{NULL} verrà impostato il tempo corrente sia per l'ultimo
accesso che per l'ultima modifica. Nei singoli elementi di \param{times} si
possono inoltre utilizzare due valori speciali per il campo \var{tv\_nsec}:
-con \const{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
-\const{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
+con \constd{UTIME\_NOW} si richiede l'uso del tempo corrente, mentre con
+\constd{UTIME\_OMIT} si richiede di non impostare il tempo. Si può così
aggiornare in maniera specifica soltanto uno fra il tempo di ultimo accesso e
quello di ultima modifica. Quando si usa uno di questi valori speciali per
\var{tv\_nsec} il corrispondente valore di \var{tv\_sec} viene ignorato.
seconda supporta invece, rispetto ad \func{utimes}, una sintassi più complessa
che consente una indicazione sicura del file su cui operare specificando la
directory su cui si trova tramite il file descriptor \param{dirfd} ed il suo
-nome come \itindsub{pathname}{relativo} \textit{pathname relativo}
-in \param{pathname}.\footnote{su Linux solo \func{utimensat} è una
- \textit{system call} e \func{futimens} è una funzione di libreria, infatti
- se \param{pathname} è \var{NULL} \param{dirfd} viene considerato un file
- descriptor ordinario e il cambiamento del tempo applicato al file
- sottostante, qualunque esso sia, per cui \code{futimens(fd, times}) è del
- tutto equivalente a \code{utimensat(fd, NULL, times, 0)}.}
+nome come \textit{pathname relativo} in \param{pathname}.\footnote{su Linux
+ solo \func{utimensat} è una \textit{system call} e \func{futimens} è una
+ funzione di libreria, infatti se \param{pathname} è \var{NULL} \param{dirfd}
+ viene considerato un file descriptor ordinario e il cambiamento del tempo
+ applicato al file sottostante, qualunque esso sia, per cui
+ \code{futimens(fd, times}) è del tutto equivalente a \code{utimensat(fd,
+ NULL, times, 0)}.}
Torneremo su questa sintassi e sulla sua motivazione in
sez.~\ref{sec:file_openat}, quando tratteremo tutte le altre funzioni (le
\textbf{\var{st\_mode}} bit & \textbf{Significato} \\
\hline
\hline
- \const{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\
- \const{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\
- \const{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\
+ \constd{S\_IRUSR} & \textit{user-read}, l'utente può leggere.\\
+ \constd{S\_IWUSR} & \textit{user-write}, l'utente può scrivere.\\
+ \constd{S\_IXUSR} & \textit{user-execute}, l'utente può eseguire.\\
\hline
- \const{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\
- \const{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\
- \const{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\
+ \constd{S\_IRGRP} & \textit{group-read}, il gruppo può leggere.\\
+ \constd{S\_IWGRP} & \textit{group-write}, il gruppo può scrivere.\\
+ \constd{S\_IXGRP} & \textit{group-execute}, il gruppo può eseguire.\\
\hline
- \const{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\
- \const{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\
- \const{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\
+ \constd{S\_IROTH} & \textit{other-read}, tutti possono leggere.\\
+ \constd{S\_IWOTH} & \textit{other-write}, tutti possono scrivere.\\
+ \constd{S\_IXOTH} & \textit{other-execute}, tutti possono eseguire.\\
\hline
\end{tabular}
\caption{I bit dei permessi di accesso ai file, come definiti in
\textbf{\param{mode}} & \textbf{Significato} \\
\hline
\hline
- \const{R\_OK} & Verifica il permesso di lettura. \\
- \const{W\_OK} & Verifica il permesso di scrittura. \\
- \const{X\_OK} & Verifica il permesso di esecuzione. \\
- \const{F\_OK} & Verifica l'esistenza del file. \\
+ \constd{R\_OK} & Verifica il permesso di lettura. \\
+ \constd{W\_OK} & Verifica il permesso di scrittura. \\
+ \constd{X\_OK} & Verifica il permesso di esecuzione. \\
+ \constd{F\_OK} & Verifica l'esistenza del file. \\
\hline
\end{tabular}
\caption{Valori possibili per l'argomento \param{mode} della funzione
\textbf{\param{mode}} & \textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{S\_ISUID} & 04000 & Set user ID bit.\\
- \const{S\_ISGID} & 02000 & Set group ID bit.\\
- \const{S\_ISVTX} & 01000 & Sticky bit.\\
+ \constd{S\_ISUID} & 04000 & Set user ID bit.\\
+ \constd{S\_ISGID} & 02000 & Set group ID bit.\\
+ \constd{S\_ISVTX} & 01000 & Sticky bit.\\
\hline
- \const{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
- \const{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
- \const{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\
- \const{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\
+ \constd{S\_IRWXU} & 00700 & L'utente ha tutti i permessi.\\
+ \constd{S\_IRUSR} & 00400 & L'utente ha il permesso di lettura.\\
+ \constd{S\_IWUSR} & 00200 & L'utente ha il permesso di scrittura.\\
+ \constd{S\_IXUSR} & 00100 & L'utente ha il permesso di esecuzione.\\
\hline
- \const{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\
- \const{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\
- \const{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\
- \const{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\
+ \constd{S\_IRWXG} & 00070 & Il gruppo ha tutti i permessi.\\
+ \constd{S\_IRGRP} & 00040 & Il gruppo ha il permesso di lettura.\\
+ \constd{S\_IWGRP} & 00020 & Il gruppo ha il permesso di scrittura.\\
+ \constd{S\_IXGRP} & 00010 & Il gruppo ha il permesso di esecuzione.\\
\hline
- \const{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\
- \const{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\
- \const{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\
- \const{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\
+ \constd{S\_IRWXO} & 00007 & Gli altri hanno tutti i permessi.\\
+ \constd{S\_IROTH} & 00004 & Gli altri hanno il permesso di lettura.\\
+ \constd{S\_IWOTH} & 00002 & Gli altri hanno il permesso di scrittura.\\
+ \constd{S\_IXOTH} & 00001 & Gli altri hanno il permesso di esecuzione.\\
\hline
\end{tabular}
\caption{Valori delle costanti usate per indicare i vari bit di
puntato da \param{value}, e la sua dimensione totale (in byte) sarà indicata
dall'argomento \param{size}. Infine l'argomento \param{flag} consente di
controllare le modalità di sovrascrittura dell'attributo esteso, esso può
-prendere due valori: con \const{XATTR\_REPLACE} si richiede che l'attributo
+prendere due valori: con \constd{XATTR\_REPLACE} si richiede che l'attributo
esista, nel qual caso verrà sovrascritto, altrimenti si avrà errore, mentre
-con \const{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
+con \constd{XATTR\_CREATE} si richiede che l'attributo non esista, nel qual
caso verrà creato, altrimenti si avrà errore ed il valore attuale non sarà
modificato. Utilizzando per \param{flag} un valore nullo l'attributo verrà
modificato se è già presente, o creato se non c'è.
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{ACL\_USER\_OBJ} & Voce che contiene i diritti di accesso del
+ \constd{ACL\_USER\_OBJ}& Voce che contiene i diritti di accesso del
proprietario del file.\\
- \const{ACL\_USER} & Voce che contiene i diritti di accesso per
+ \constd{ACL\_USER} & Voce che contiene i diritti di accesso per
l'utente indicato dal rispettivo
qualificatore.\\
- \const{ACL\_GROUP\_OBJ}& Voce che contiene i diritti di accesso del
+ \constd{ACL\_GROUP\_OBJ}&Voce che contiene i diritti di accesso del
gruppo proprietario del file.\\
- \const{ACL\_GROUP} & Voce che contiene i diritti di accesso per
+ \constd{ACL\_GROUP} & Voce che contiene i diritti di accesso per
il gruppo indicato dal rispettivo
qualificatore.\\
- \const{ACL\_MASK} & Voce che contiene la maschera dei massimi
+ \constd{ACL\_MASK} & Voce che contiene la maschera dei massimi
permessi di accesso che possono essere garantiti
da voci del tipo \const{ACL\_USER},
\const{ACL\_GROUP} e \const{ACL\_GROUP\_OBJ}.\\
- \const{ACL\_OTHER} & Voce che contiene i diritti di accesso di chi
+ \constd{ACL\_OTHER} & Voce che contiene i diritti di accesso di chi
non corrisponde a nessuna altra voce dell'ACL.\\
\hline
\end{tabular}
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
- \const{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\
+ \constd{ACL\_TYPE\_ACCESS} & Indica una ACL di accesso.\\
+ \constd{ACL\_TYPE\_DEFAULT}& Indica una ACL di default.\\
\hline
\end{tabular}
\caption{Le costanti che identificano il tipo di ACL.}
\textbf{Tipo} & \textbf{Descrizione} \\
\hline
\hline
- \const{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
- \const{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
+ \constd{TEXT\_ABBREVIATE} & Stampa le voci in forma abbreviata.\\
+ \constd{TEXT\_NUMERIC\_IDS} & non effettua la risoluzione numerica di
\ids{UID} e \ids{GID}.\\
- \const{TEXT\_SOME\_EFFECTIVE}& Per ciascuna voce che contiene permessi che
+ \constd{TEXT\_SOME\_EFFECTIVE}&Per ciascuna voce che contiene permessi che
vengono eliminati dalla \const{ACL\_MASK}
viene generato un commento con i permessi
effettivamente risultanti; il commento è
separato con un tabulatore.\\
- \const{TEXT\_ALL\_EFFECTIVE} & Viene generato un commento con i permessi
+ \constd{TEXT\_ALL\_EFFECTIVE}& Viene generato un commento con i permessi
effettivi per ciascuna voce che contiene
permessi citati nella \const{ACL\_MASK},
anche quando questi non vengono modificati
da essa; il commento è separato con un
tabulatore.\\
- \const{TEXT\_SMART\_INDENT} & Da usare in combinazione con le precedenti
+ \constd{TEXT\_SMART\_INDENT} & Da usare in combinazione con le precedenti
opzioni \const{TEXT\_SOME\_EFFECTIVE} e
\const{TEXT\_ALL\_EFFECTIVE}, aumenta
automaticamente il numero di spaziatori
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/quota.h}
-\fdecl{int \macro{QCMD}(subcmd,type)}
+\fdecl{int \macrod{QCMD}(subcmd,type)}
\fdesc{Imposta il comando \param{subcmd} per il tipo di quote (utente o
gruppo) \param{type}.}
}
\textbf{Comando} & \textbf{Descrizione} \\
\hline
\hline
- \const{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
+ \constd{Q\_QUOTAON} & Attiva l'applicazione delle quote disco per il
filesystem indicato da \param{dev}, si deve passare
in \param{addr} il \textit{pathname} al file che
mantiene le quote, che deve esistere, e \param{id}
valori di tab.~\ref{tab:quotactl_id_format};
l'operazione richiede i privilegi di
amministratore.\\
- \const{Q\_QUOTAOFF} & Disattiva l'applicazione delle quote disco per il
+ \constd{Q\_QUOTAOFF}& Disattiva l'applicazione delle quote disco per il
filesystem indicato da \param{dev}, \param{id}
e \param{addr} vengono ignorati; l'operazione
richiede i privilegi di amministratore.\\
- \const{Q\_GETQUOTA} & Legge i limiti ed i valori correnti delle quote nel
+ \constd{Q\_GETQUOTA}& Legge i limiti ed i valori correnti delle quote nel
filesystem indicato da \param{dev} per l'utente o
il gruppo specificato da \param{id}; si devono avere
i privilegi di amministratore per leggere i dati
parte, il risultato viene restituito in una struttura
\struct{dqblk} all'indirizzo indicato
da \param{addr}.\\
- \const{Q\_SETQUOTA} & Imposta i limiti per le quote nel filesystem
+ \constd{Q\_SETQUOTA}& Imposta i limiti per le quote nel filesystem
indicato da \param{dev} per l'utente o il gruppo
specificato da \param{id} secondo i valori ottenuti
dalla struttura \struct{dqblk} puntata
da \param{addr}; l'operazione richiede i privilegi
di amministratore.\\
- \const{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
+ \constd{Q\_GETINFO} & Legge le informazioni (in sostanza i \textit{grace
time}) delle quote del filesystem indicato
da \param{dev} sulla struttura \struct{dqinfo}
puntata da \param{addr}, \param{id} viene ignorato.\\
- \const{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
+ \constd{Q\_SETINFO} & Imposta le informazioni delle quote del filesystem
indicato da \param{dev} come ottenuti dalla
struttura \struct{dqinfo} puntata
da \param{addr}, \param{id} viene ignorato;
l'operazione richiede i privilegi di amministratore.\\
- \const{Q\_GETFMT} & Richiede il valore identificativo (quello di
+ \constd{Q\_GETFMT} & Richiede il valore identificativo (quello di
tab.~\ref{tab:quotactl_id_format}) per il formato
delle quote attualmente in uso sul filesystem
indicato da \param{dev}, che sarà memorizzato
sul buffer di 4 byte puntato da \param{addr}.\\
- \const{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del
+ \constd{Q\_SYNC} & Aggiorna la copia su disco dei dati delle quote del
filesystem indicato da \param{dev}; in questo
caso \param{dev} può anche essere \val{NULL} nel
qual caso verranno aggiornati i dati per tutti i
filesystem con quote attive, \param{id}
e \param{addr} vengono comunque ignorati.\\
- \const{Q\_GETSTATS} & Ottiene statistiche ed altre informazioni generali
+ \constd{Q\_GETSTATS}& Ottiene statistiche ed altre informazioni generali
relative al sistema delle quote per il filesystem
indicato da \param{dev}, richiede che si
passi come argomento \param{addr} l'indirizzo di una
\textbf{Costante} & \textbf{Descrizione} \\
\hline
\hline
- \const{QIF\_BLIMITS}& Limiti sui blocchi di
- spazio disco (\val{dqb\_bhardlimit} e
- \val{dqb\_bsoftlimit}).\\
- \const{QIF\_SPACE} & Uso corrente
- dello spazio disco (\val{dqb\_curspace}).\\
- \const{QIF\_ILIMITS}& Limiti sugli \textit{inode}
- (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
- \const{QIF\_INODES} & Uso corrente
- degli \textit{inode} (\val{dqb\_curinodes}).\\
- \const{QIF\_BTIME} & Tempo di
- sforamento del \textit{soft limit} sul numero di
- blocchi (\val{dqb\_btime}).\\
- \const{QIF\_ITIME} & Tempo di sforamento del \textit{soft limit} sul
- numero di \textit{inode} (\val{dqb\_itime}).\\
- \const{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
- \const{QIF\_ILIMITS}.\\
- \const{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e
- \const{QIF\_INODES}.\\
- \const{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e
- \const{QIF\_ITIME}.\\
- \const{QIF\_ALL} & Tutti i precedenti.\\
+ \constd{QIF\_BLIMITS}& Limiti sui blocchi di spazio disco
+ (\val{dqb\_bhardlimit} e \val{dqb\_bsoftlimit}).\\
+ \constd{QIF\_SPACE} & Uso corrente dello spazio disco
+ (\val{dqb\_curspace}).\\
+ \constd{QIF\_ILIMITS}& Limiti sugli \textit{inode}
+ (\val{dqb\_ihardlimit} e \val{dqb\_isoftlimit}).\\
+ \constd{QIF\_INODES} & Uso corrente degli \textit{inode}
+ (\val{dqb\_curinodes}).\\
+ \constd{QIF\_BTIME} & Tempo di sforamento del \textit{soft limit} sul
+ numero di blocchi (\val{dqb\_btime}).\\
+ \constd{QIF\_ITIME} & Tempo di sforamento del \textit{soft limit} sul
+ numero di \textit{inode} (\val{dqb\_itime}).\\
+ \constd{QIF\_LIMITS} & L'insieme di \const{QIF\_BLIMITS} e
+ \const{QIF\_ILIMITS}.\\
+ \constd{QIF\_USAGE} & L'insieme di \const{QIF\_SPACE} e
+ \const{QIF\_INODES}.\\
+ \constd{QIF\_TIMES} & L'insieme di \const{QIF\_BTIME} e
+ \const{QIF\_ITIME}.\\
+ \constd{QIF\_ALL} & Tutti i precedenti.\\
\hline
\end{tabular}
\caption{Costanti per il campo \val{dqb\_valid} di \struct{dqblk}.}
\textbf{Identificatore} & \textbf{Descrizione} \\
\hline
\hline
- \const{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
- \const{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
- \ids{UID} e \ids{GID} a 32 bit e limiti fino a
- $2^{42}$ byte e $2^{32}$ file.\\
- \const{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
- \ids{UID} e \ids{GID} a 32 bit e limiti fino a
- $2^{64}$ byte e $2^{64}$ file.\\
+ \constd{QFMT\_VFS\_OLD}& Il vecchio (ed obsoleto) formato delle quote.\\
+ \constd{QFMT\_VFS\_V0} & La versione 0 usata dal VFS di Linux, supporta
+ \ids{UID} e \ids{GID} a 32 bit e limiti fino a
+ $2^{42}$ byte e $2^{32}$ file.\\
+ \constd{QFMT\_VFS\_V1} & La versione 1 usata dal VFS di Linux, supporta
+ \ids{UID} e \ids{GID} a 32 bit e limiti fino a
+ $2^{64}$ byte e $2^{64}$ file.\\
\hline
\end{tabular}
\caption{Valori di identificazione del formato delle quote.}
\label{tab:quotactl_id_format}
\end{table}
-
-
Altre due operazioni che necessitano di ulteriori spiegazioni sono
\const{Q\_GETINFO} e \const{Q\_SETINFO}, che consentono di ottenere i dati
relativi alle impostazioni delle altre proprietà delle quote, che al momento
\textbf{Costante} & \textbf{Descrizione} \\
\hline
\hline
- \const{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
+ \constd{IIF\_BGRACE}& Il \textit{grace period} per i blocchi
(\val{dqi\_bgrace}).\\
- \const{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode}
+ \constd{IIF\_IGRACE}& Il \textit{grace period} per gli \textit{inode}
(\val{dqi\_igrace}).\\
- \const{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
- \const{IIF\_ALL} & Tutti i precedenti.\\
+ \constd{IIF\_FLAGS} & I flag delle quote (\val{dqi\_flags}) (inusato ?).\\
+ \constd{IIF\_ALL} & Tutti i precedenti.\\
\hline
\end{tabular}
\caption{Costanti per il campo \val{dqi\_valid} di \struct{dqinfo}.}
\textbf{Flag} & \textbf{Descrizione} \\
\hline
\hline
- \const{SECURE\_KEEP\_CAPS}& Il processo non subisce la cancellazione delle
+ \constd{SECURE\_KEEP\_CAPS}&Il processo non subisce la cancellazione delle
sue \textit{capabilities} quando tutti i suoi
\ids{UID} passano ad un valore non
nullo (regola di compatibilità per il cambio
elenco), sostituisce il precedente uso
dell'operazione \const{PR\_SET\_KEEPCAPS} di
\func{prctl}.\\
- \const{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
+ \constd{SECURE\_NO\_SETUID\_FIXUP}&Il processo non subisce le modifiche
delle sue \textit{capabilities} nel passaggio
da nullo a non nullo degli \ids{UID}
dei gruppi \textit{effective} e
\textit{file system} (regole di compatibilità
per il cambio di \ids{UID} nn.~1 e 2 del
precedente elenco).\\
- \const{SECURE\_NOROOT} & Il processo non assume nessuna capacità
+ \constd{SECURE\_NOROOT} & Il processo non assume nessuna capacità
aggiuntiva quando esegue un programma, anche
se ha \ids{UID} nullo o il programma ha
il \acr{suid} bit attivo ed appartiene
corrispondente flag di blocco, identificato da una costante omonima con
l'estensione \texttt{\_LOCKED}, la cui attivazione è irreversibile ed ha
l'effetto di rendere permanente l'impostazione corrente del corrispondente
-flag ordinario; in sostanza con \const{SECURE\_KEEP\_CAPS\_LOCKED} si rende
+flag ordinario; in sostanza con \constd{SECURE\_KEEP\_CAPS\_LOCKED} si rende
non più modificabile \const{SECURE\_KEEP\_CAPS}, ed analogamente avviene con
-\const{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
-\const{SECURE\_NO\_SETUID\_FIXUP} e con \const{SECURE\_NOROOT\_LOCKED} per
+\constd{SECURE\_NO\_SETUID\_FIXUP\_LOCKED} per
+\const{SECURE\_NO\_SETUID\_FIXUP} e con \constd{SECURE\_NOROOT\_LOCKED} per
\const{SECURE\_NOROOT}.
Per l'impostazione di questi flag sono state predisposte due specifiche
%
% POSIX-draft defined capabilities.
%
- \const{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
+ \constd{CAP\_AUDIT\_CONTROL}& Abilitare e disabilitare il
controllo dell'auditing (dal kernel 2.6.11).\\
- \const{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
+ \constd{CAP\_AUDIT\_WRITE}&Scrivere dati nel giornale di
auditing del kernel (dal kernel 2.6.11).\\
% TODO verificare questa roba dell'auditing
- \const{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
+ \constd{CAP\_BLOCK\_SUSPEND}&Utilizzare funzionalità che possono bloccare
la sospensione del sistema (dal kernel 3.5).\\
- \const{CAP\_CHOWN} & Cambiare proprietario e gruppo
+ \constd{CAP\_CHOWN} & Cambiare proprietario e gruppo
proprietario di un file (vedi
sez.~\ref{sec:file_ownership_management}).\\
- \const{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
- permessi di lettura, scrittura ed esecuzione dei
- file, (vedi sez.~\ref{sec:file_access_control}).\\
- \const{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
+ \constd{CAP\_DAC\_OVERRIDE}& Evitare il controllo dei
+ permessi di lettura, scrittura ed esecuzione dei
+ file, (vedi sez.~\ref{sec:file_access_control}).\\
+ \constd{CAP\_DAC\_READ\_SEARCH}& Evitare il controllo dei
permessi di lettura ed esecuzione per
le directory (vedi
sez.~\ref{sec:file_access_control}).\\
per tutte le operazioni privilegiate non coperte
dalle precedenti \const{CAP\_DAC\_OVERRIDE} e
\const{CAP\_DAC\_READ\_SEARCH}.\\
- \const{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
+ \constd{CAP\_FSETID} & Evitare la cancellazione automatica dei bit
\acr{suid} e \acr{sgid} quando un file
per i quali sono impostati viene modificato da
un processo senza questa capacità e la capacità
quando questo è relativo ad un gruppo cui non si
appartiene (vedi
sez.~\ref{sec:file_perm_management}).\\
- \const{CAP\_KILL} & Mandare segnali a qualunque
+ \constd{CAP\_KILL} & Mandare segnali a qualunque
processo (vedi sez.~\ref{sec:sig_kill_raise}).\\
- \const{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
+ \constd{CAP\_SETFCAP} & Impostare le \textit{capabilities} di un file
(dal kernel 2.6.24).\\
- \const{CAP\_SETGID} & Manipolare i group ID dei
+ \constd{CAP\_SETGID} & Manipolare i group ID dei
processi, sia il principale che i supplementari,
(vedi sez.~\ref{sec:proc_setgroups}) che quelli
trasmessi tramite i socket \textit{unix domain}
(vedi sez.~\ref{sec:unix_socket}).\\
- \const{CAP\_SETUID} & Manipolare gli user ID del
+ \constd{CAP\_SETUID} & Manipolare gli user ID del
processo (vedi sez.~\ref{sec:proc_setuid}) e di
trasmettere un user ID arbitrario nel passaggio
delle credenziali coi socket \textit{unix
% Linux specific capabilities
%
\hline
- \const{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
+ \constd{CAP\_IPC\_LOCK} & Effettuare il \textit{memory locking} con le
funzioni \func{mlock}, \func{mlockall},
\func{shmctl}, \func{mmap} (vedi
sez.~\ref{sec:proc_mem_lock} e
sez.~\ref{sec:file_memory_map}). \\
% TODO verificare l'interazione con SHM_HUGETLB
- \const{CAP\_IPC\_OWNER} & Evitare il controllo dei permessi
+ \constd{CAP\_IPC\_OWNER}& Evitare il controllo dei permessi
per le operazioni sugli oggetti di
intercomunicazione fra processi (vedi
sez.~\ref{sec:ipc_sysv}).\\
- \const{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
+ \constd{CAP\_LEASE} & Creare dei \textit{file lease} (vedi
sez.~\ref{sec:file_asyncronous_lease})
pur non essendo proprietari del file (dal kernel
2.4).\\
- \const{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
- \textit{immutable} e \textit{append-only} (vedi
- sez.~\ref{sec:file_perm_overview}) se
- supportati.\\
- \const{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
+ \constd{CAP\_LINUX\_IMMUTABLE}& Impostare sui file gli attributi
+ \textit{immutable} e \textit{append-only} (vedi
+ sez.~\ref{sec:file_perm_overview}) se
+ supportati.\\
+ \constd{CAP\_MAC\_ADMIN}& Amministrare il \textit{Mandatory
+ Access Control} di \textit{Smack} (dal kernel
+ 2.6.25).\\
+ \constd{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
+ Access Control} di \textit{Smack} (dal kernel
+ 2.6.25).\\
+ \constd{CAP\_MKNOD} & Creare file di dispositivo con \func{mknod} (vedi
sez.~\ref{sec:file_mknod}) (dal kernel 2.4).\\
\const{CAP\_NET\_ADMIN} & Eseguire alcune operazioni
privilegiate sulla rete.\\
- \const{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
+ \constd{CAP\_NET\_BIND\_SERVICE}& Porsi in ascolto su porte riservate (vedi
sez.~\ref{sec:TCP_func_bind}).\\
- \const{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
+ \constd{CAP\_NET\_BROADCAST}& Consentire l'uso di socket in
\textit{broadcast} e \textit{multicast}.\\
- \const{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
+ \constd{CAP\_NET\_RAW} & Usare socket \texttt{RAW} e \texttt{PACKET}
(vedi sez.~\ref{sec:sock_type}).\\
\const{CAP\_SETPCAP} & Effettuare modifiche privilegiate alle
\textit{capabilities}.\\
\const{CAP\_SYS\_ADMIN} & Eseguire una serie di compiti amministrativi.\\
- \const{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
+ \constd{CAP\_SYS\_BOOT} & Eseguire un riavvio del sistema (vedi
sez.~\ref{sec:sys_reboot}).\\
- \const{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
+ \constd{CAP\_SYS\_CHROOT}& Eseguire la funzione \func{chroot} (vedi
sez.~\ref{sec:file_chroot}).\\
- \const{CAP\_MAC\_ADMIN} & Amministrare il \textit{Mandatory
- Access Control} di \textit{Smack} (dal kernel
- 2.6.25).\\
- \const{CAP\_MAC\_OVERRIDE}& Evitare il \textit{Mandatory
- Access Control} di \textit{Smack} (dal kernel
- 2.6.25).\\
- \const{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
+ \constd{CAP\_SYS\_MODULE}& Caricare e rimuovere moduli del kernel.\\
\const{CAP\_SYS\_NICE} & Modificare le varie priorità dei processi (vedi
sez.~\ref{sec:proc_priority}).\\
- \const{CAP\_SYS\_PACCT} & Usare le funzioni di \textit{accounting} dei
+ \constd{CAP\_SYS\_PACCT}& Usare le funzioni di \textit{accounting} dei
processi (vedi
sez.~\ref{sec:sys_bsd_accounting}).\\
- \const{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
+ \constd{CAP\_SYS\_PTRACE}& La capacità di tracciare qualunque processo con
\func{ptrace} (vedi
sez.~\ref{sec:process_ptrace}).\\
- \const{CAP\_SYS\_RAWIO} & Operare sulle porte di I/O con \func{ioperm} e
+ \constd{CAP\_SYS\_RAWIO}& Operare sulle porte di I/O con \func{ioperm} e
\func{iopl} (vedi
sez.~\ref{sec:process_io_port}).\\
\const{CAP\_SYS\_RESOURCE}& Superare le varie limitazioni sulle risorse.\\
- \const{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
+ \constd{CAP\_SYS\_TIME} & Modificare il tempo di sistema (vedi
sez.~\ref{sec:sys_time}).\\
- \const{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
+ \constd{CAP\_SYS\_TTY\_CONFIG}&Simulare un \textit{hangup} della console,
con la funzione \func{vhangup}.\\
- \const{CAP\_SYSLOG} & Gestire il buffer dei messaggi
+ \constd{CAP\_SYSLOG} & Gestire il buffer dei messaggi
del kernel, (vedi sez.~\ref{sec:sess_daemon}),
introdotta dal kernel 2.6.38 come capacità
separata da \const{CAP\_SYS\_ADMIN}.\\
- \const{CAP\_WAKE\_ALARM}& Usare i timer di tipo
+ \constd{CAP\_WAKE\_ALARM}&Usare i timer di tipo
\const{CLOCK\_BOOTTIME\_ALARM} e
\const{CLOCK\_REALTIME\_ALARM}, vedi
sez.~\ref{sec:sig_timer_adv} (dal kernel 3.0).\\
\label{tab:proc_capabilities}
\end{table}
+\constbeg{CAP\_SETPCAP}
Prima di dettagliare il significato della capacità più generiche, conviene
però dedicare un discorso a parte a \const{CAP\_SETPCAP}, il cui significato è
conseguente impossibilità successiva di eseguire programmi con quella
capacità), o di impostare i \textit{securebits} delle \textit{capabilities}.
+\constend{CAP\_SETPCAP}
+\constbeg{CAP\_FOWNER}
+
La prima fra le capacità ``\textsl{ampie}'' che occorre dettagliare
maggiormente è \const{CAP\_FOWNER}, che rimuove le restrizioni poste ad un
processo che non ha la proprietà di un file in un vasto campo di
sez.~\ref{sec:file_open_close} e sez.~\ref{sec:file_fcntl_ioctl}) senza
restrizioni.
+\constend{CAP\_FOWNER}
+\constbeg{CAP\_NET\_ADMIN}
+
Una seconda capacità che copre diverse operazioni, in questo caso riguardanti
la rete, è \const{CAP\_NET\_ADMIN}, che consente di impostare le opzioni
privilegiate dei socket (vedi sez.~\ref{sec:sock_generic_options}), abilitare
configurazione delle interfacce di rete (vedi
sez.~\ref{sec:sock_ioctl_netdevice}) ed impostare la tabella di instradamento.
+\constend{CAP\_NET\_ADMIN}
+\constbeg{CAP\_SYS\_ADMIN}
+
Una terza \textit{capability} con vasto campo di applicazione è
\const{CAP\_SYS\_ADMIN}, che copre una serie di operazioni amministrative,
come impostare le quote disco (vedi sez.\ref{sec:disk_quota}), attivare e
usare \const{CLONE\_NEWNS} con \func{unshare} e \func{clone}, (vedi
sez.~\ref{sec:process_clone}).
+\constend{CAP\_SYS\_ADMIN}
+\constbeg{CAP\_SYS\_NICE}
+
Originariamente \const{CAP\_SYS\_NICE} riguardava soltanto la capacità di
aumentare le priorità di esecuzione dei processi, come la diminuzione del
valore di \textit{nice} (vedi sez.~\ref{sec:proc_sched_stand}), l'uso delle
arbitrarie nell'accesso a disco (vedi sez.~\ref{sec:io_priority}) e nelle
politiche di allocazione delle pagine di memoria ai nodi di un sistema NUMA.
+\constend{CAP\_SYS\_NICE}
+\constbeg{CAP\_SYS\_RESOURCE}
+
Infine la \textit{capability} \const{CAP\_SYS\_RESOURCE} attiene alla
possibilità di superare i limiti imposti sulle risorse di sistema, come usare
lo spazio disco riservato all'amministratore sui filesystem che lo supportano,
numero di processi, ed i limiti sulle dimensioni dei messaggi delle code del
SysV IPC (vedi sez.~\ref{sec:ipc_sysv_mq}).
+\constend{CAP\_SYS\_RESOURCE}
+
Per la gestione delle \textit{capabilities} il kernel mette a disposizione due
funzioni che permettono rispettivamente di leggere ed impostare i valori dei
tre insiemi illustrati in precedenza. Queste due funzioni di sistema sono
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
- \const{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
- \const{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
+ \constd{CAP\_EFFECTIVE} & Capacità dell'insieme \textsl{effettivo}.\\
+ \constd{CAP\_PERMITTED} & Capacità dell'insieme \textsl{permesso}.\\
+ \constd{CAP\_INHERITABLE}& Capacità dell'insieme \textsl{ereditabile}.\\
\hline
\end{tabular}
\caption{Valori possibili per il tipo di dato \type{cap\_flag\_t} che
\vspace{3pt}
\begin{funcbox}{
\fhead{sys/capability.h}
-\fdecl{int \macro{CAP\_DIFFERS}(value, flag)}
+\fdecl{int \macrod{CAP\_DIFFERS}(value, flag)}
\fdesc{Controlla lo stato di eventuali differenze delle \textit{capabilities}
nell'insieme \texttt{flag}.}
}
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{CAP\_CLEAR}& La capacità non è impostata.\\
- \const{CAP\_SET} & La capacità è impostata.\\
+ \constd{CAP\_CLEAR}& La capacità non è impostata.\\
+ \constd{CAP\_SET} & La capacità è impostata.\\
\hline
\end{tabular}
\caption{Valori possibili per il tipo di dato \type{cap\_flag\_value\_t} che
\kstruct{fs\_struct}; vedi fig.~\ref{fig:proc_task_struct}.} che, pur
essendo di norma corrispondente alla radice dell'albero dei file dell'intero
sistema, ha per il processo il significato specifico di directory rispetto
-alla quale vengono risolti i \itindsub{pathname}{assoluto}\textit{pathname}
-assoluti.\footnote{cioè quando un processo chiede la risoluzione di un
- \textit{pathname}, il kernel usa sempre questa directory come punto di
- partenza.} Il fatto che questo valore sia specificato per ogni processo apre
-allora la possibilità di modificare le modalità di risoluzione dei
-\itindsub{pathname}{assoluto} \textit{pathname} assoluti da parte di un
-processo cambiando questa directory, così come si fa coi
-\itindsub{pathname}{relativo} \textit{pathname} relativi cambiando la
-directory di lavoro.
+alla quale vengono risolti i \textit{pathname} assoluti.\footnote{cioè quando
+ un processo chiede la risoluzione di un \textit{pathname}, il kernel usa
+ sempre questa directory come punto di partenza.} Il fatto che questo valore
+sia specificato per ogni processo apre allora la possibilità di modificare le
+modalità di risoluzione dei \textit{pathname} assoluti da parte di un processo
+cambiando questa directory, così come si fa coi \textit{pathname} relativi
+cambiando la directory di lavoro.
Normalmente la directory radice di un processo coincide con la radice generica
dell'albero dei file, che è la directory che viene montata direttamente dal
\end{funcproto}
La funzione imposta la directory radice del processo a quella specificata da
-\param{path} (che ovviamente deve esistere) ed ogni
-\itindsub{pathname}{assoluto} \textit{pathname} assoluto usato dalle funzioni
-chiamate nel processo sarà risolto a partire da essa, rendendo impossibile
-accedere alla parte di albero sovrastante. Si ha così quella che viene
-chiamata una \textit{chroot jail}, in quanto il processo non può più accedere
-a file al di fuori della sezione di albero in cui è stato
+\param{path} (che ovviamente deve esistere) ed ogni \textit{pathname} assoluto
+usato dalle funzioni chiamate nel processo sarà risolto a partire da essa,
+rendendo impossibile accedere alla parte di albero sovrastante. Si ha così
+quella che viene chiamata una \textit{chroot jail}, in quanto il processo non
+può più accedere a file al di fuori della sezione di albero in cui è stato
\textsl{imprigionato}.
Solo un processo con i privilegi di amministratore può usare questa
ad un ramo di albero solo se dopo averla eseguita si cedono i privilegi di
amministratore. Infatti se per un qualunque motivo il processo resta con la
sua directory di lavoro al di fuori dalla \textit{chroot jail}, potrà accedere
-a tutto il resto del filesystem usando \itindsub{pathname}{relativo} dei
-\textit{pathname} relativi, dato che in tal caso è possibile, grazie all'uso
-di ``\texttt{..}'', risalire all'indietro fino alla radice effettiva
-dell'albero dei file.
+a tutto il resto del filesystem usando dei \textit{pathname} relativi, dato
+che in tal caso è possibile, grazie all'uso di ``\texttt{..}'', risalire
+all'indietro fino alla radice effettiva dell'albero dei file.
Potrebbe sembrare che per risolvere il problema sia sufficiente ricordarsi di
eseguire preventivamente anche una \func{chdir} sulla directory su cui si
Esamineremo in questo capitolo le due interfacce di programmazione che
consentono di gestire i dati mantenuti nei file. Cominceremo con quella nativa
-del sistema, detta dei \itindex{file~descriptor} \textit{file descriptor}, che
-viene fornita direttamente dalle \textit{system call} e che non prevede
-funzionalità evolute come la bufferizzazione o funzioni di lettura o scrittura
+del sistema, detta dei \textit{file descriptor}, che viene fornita
+direttamente dalle \textit{system call} e che non prevede funzionalità evolute
+come la bufferizzazione o funzioni di lettura o scrittura
formattata. Esamineremo poi anche l'interfaccia definita dallo standard ANSI
C, che viene chiamata dei \textit{file stream} o anche più brevemente degli
\textit{stream}. Per entrambe dopo una introduzione alle caratteristiche
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
assicurarsi che questo non esista di già, e lo si usa spesso per creare i
-cosiddetti \index{file!di lock} ``\textsl{file di lock}'' (vedi
-sez.~\ref{sec:ipc_file_lock}). Si tenga presente che questa opzione è
-supportata su NFS solo a partire da NFSv3 e con il kernel 2.6, nelle versioni
-precedenti la funzionalità viene emulata controllando prima l'esistenza del
-file per cui usarla per creare \index{file!di lock} un file di lock potrebbe
-dar luogo a una \textit{race condition}.\footnote{un file potrebbe venir
- creato fra il controllo la successiva apertura con \const{O\_CREAT}, la cosa
- si può risolvere comunque creando un file con un nome univoco ed usando la
- funzione \func{link} per creare il \index{file!di lock} file di lock, (vedi
- sez.~\ref{sec:ipc_file_lock}).}
+cosiddetti ``\textsl{file di lock}'' (vedi sez.~\ref{sec:ipc_file_lock}). Si
+tenga presente che questa opzione è supportata su NFS solo a partire da NFSv3
+e con il kernel 2.6, nelle versioni precedenti la funzionalità viene emulata
+controllando prima l'esistenza del file per cui usarla per creare un file di
+lock potrebbe dar luogo a una \textit{race condition}.\footnote{un file
+ potrebbe venir creato fra il controllo la successiva apertura con
+ \const{O\_CREAT}, la cosa si può risolvere comunque creando un file con un
+ nome univoco ed usando la funzione \func{link} per creare il file di lock,
+ (vedi sez.~\ref{sec:ipc_file_lock}).}
Se si usa \const{O\_EXCL} senza \const{O\_CREAT} il comportamento è
indefinito. Nella creazione di un file con \const{O\_CREAT} occorre sempre
\itindbeg{at-functions}
Un problema generale che si pone con l'uso della funzione \func{open}, così
-come per le altre funzioni che prendono come argomenti dei
-\itindsub{pathname}{relativo} \textit{pathname} relativi, è la possibilità,
-quando un \textit{pathname} relativo non fa riferimento ad un file posto
-direttamente nella directory di lavoro corrente, che alcuni dei componenti del
-\textit{pathname} vengano modificati in parallelo alla chiamata a \func{open},
-cosa che lascia aperta la possibilità di una \textit{race condition} in cui
-c'è spazio per un \textit{symlink attack} (si ricordi quanto visto per
-\func{access} in sez.~\ref{sec:file_perm_management}).
+come per le altre funzioni che prendono come argomenti dei \textit{pathname}
+relativi, è la possibilità, quando un \textit{pathname} relativo non fa
+riferimento ad un file posto direttamente nella directory di lavoro corrente,
+che alcuni dei componenti del \textit{pathname} vengano modificati in
+parallelo alla chiamata a \func{open}, cosa che lascia aperta la possibilità
+di una \textit{race condition} in cui c'è spazio per un \textit{symlink
+ attack} (si ricordi quanto visto per \func{access} in
+sez.~\ref{sec:file_perm_management}).
Inoltre come già accennato, la directory di lavoro corrente è una proprietà
del singolo processo; questo significa che quando si lavora con i
\func{open}, \func{mkdir}, ecc.) sono state introdotte delle ulteriori
funzioni, dette anche ``\textit{at-functions}'' in quanto contraddistinte dal
suffisso \texttt{at}, che permettono l'apertura di un file (o le rispettive
-altre operazioni) usando un \itindsub{pathname}{relativo} \textit{pathname}
-relativo ad una directory specificata.\footnote{l'introduzione è avvenuta su
- proposta dello sviluppatore principale della \acr{glibc} Urlich Drepper e le
- corrispondenti \textit{system call} sono state inserite nel kernel a partire
- dalla versione 2.6.16, in precedenza era disponibile una emulazione che, sia
- pure con prestazioni inferiori, funzionava facendo ricorso all'uso del
- filesystem \textit{proc} con l'apertura del file attraverso il riferimento a
+altre operazioni) usando un \textit{pathname} relativo ad una directory
+specificata.\footnote{l'introduzione è avvenuta su proposta dello sviluppatore
+ principale della \acr{glibc} Urlich Drepper e le corrispondenti
+ \textit{system call} sono state inserite nel kernel a partire dalla versione
+ 2.6.16, in precedenza era disponibile una emulazione che, sia pure con
+ prestazioni inferiori, funzionava facendo ricorso all'uso del filesystem
+ \textit{proc} con l'apertura del file attraverso il riferimento a
\textit{pathname} del tipo di \texttt{/proc/self/fd/dirfd/relative\_path}.}
Benché queste funzioni non siano presenti negli standard tradizionali esse
-sono state adottate da altri sistemi unix-like come Solaris, i vari BSD, fino ad
-essere incluse in una recente revisione (la POSIX.1-2008) dello standard
+sono state adottate da altri sistemi unix-like come Solaris, i vari BSD, fino
+ad essere incluse in una recente revisione (la POSIX.1-2008) dello standard
POSIX.1. Con la \acr{glibc} per l'accesso a queste funzioni è necessario
definire la macro \macro{\_ATFILE\_SOURCE}.
L'uso di queste funzioni prevede una apertura iniziale della directory che
-sarà la base della risoluzione dei \itindsub{pathname}{relativo}
-\textit{pathname} relativi che verranno usati in seguito, dopo di che si dovrà
-passare il relativo file descriptor alle varie funzioni che useranno quella
-directory come punto di partenza per la risoluzione. In questo modo, anche
-quando si lavora con i \itindex{thread} \textit{thread}, si può mantenere una
-directory di lavoro diversa per ciascuno di essi.
+sarà la base della risoluzione dei \textit{pathname} relativi che verranno
+usati in seguito, dopo di che si dovrà passare il relativo file descriptor
+alle varie funzioni che useranno quella directory come punto di partenza per
+la risoluzione. In questo modo, anche quando si lavora con i \itindex{thread}
+\textit{thread}, si può mantenere una directory di lavoro diversa per ciascuno
+di essi.
Questo metodo, oltre a risolvere i problemi di \textit{race condition},
consente anche di ottenere aumenti di prestazioni significativi quando si
\func{open}, ed in più:
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
- \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+ ma \param{dirfd} fa riferimento ad un file.
\end{errlist}
}
\end{funcproto}
Il comportamento delle nuove funzioni è del tutto analogo a quello delle
corrispettive classiche, con la sola eccezione del fatto che se fra i loro
-argomenti si utilizza un \itindsub{pathname}{relativo} \textit{pathname}
-relativo questo sarà risolto rispetto alla directory indicata
-da \param{dirfd}. Qualora invece si usi un \itindsub{pathname}{assoluto}
+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
risoluzione sarà effettuata rispetto alla directory di lavoro corrente del
particolare si avrà un errore di \errcode{EBADF} se esso non è un file
descriptor valido, ed un errore di \errcode{ENOTDIR} se esso non fa
riferimento ad una directory, tranne il caso in cui si sia specificato un
-\itindsub{pathname}{assoluto} \textit{pathname} assoluto, nel qual caso, come
-detto, il valore di \param{dirfd} sarà completamente ignorato.
+\textit{pathname} assoluto, nel qual caso, come detto, il valore
+di \param{dirfd} sarà completamente ignorato.
\begin{table}[htb]
\centering
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
\item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
- \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+ ma \param{dirfd} fa riferimento ad un file.
\end{errlist}
}
\end{funcproto}
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
\item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
- \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+ ma \param{dirfd} fa riferimento ad un file.
\end{errlist}
}
\end{funcproto}
\begin{errlist}
\item[\errcode{EBADF}] \param{dirfd} non è un file descriptor valido.
\item[\errcode{EINVAL}] \param{flags} non ha un valore valido.
- \item[\errcode{ENOTDIR}] \param{pathname} è un \itindsub{pathname}{relativo}
- \textit{pathname} relativo, ma \param{dirfd} fa riferimento ad un file.
+ \item[\errcode{ENOTDIR}] \param{pathname} è un \textit{pathname} relativo,
+ ma \param{dirfd} fa riferimento ad un file.
\end{errlist}
}
\end{funcproto}
sez.~\ref{sec:file_access_control}) dovranno consentire l'accesso all'intero
\textit{pathname}.
+\itindsubbeg{pathname}{assoluto}
+\itindsubbeg{pathname}{relativo}
+
Se il \textit{pathname} comincia con il carattere ``\texttt{/}'' la ricerca
parte dalla directory radice del processo. Questa, a meno di non avere
eseguito una \func{chroot} (funzione su cui torneremo in
sez.~\ref{sec:file_chroot}) è la stessa per tutti i processi ed equivale alla
directory radice dell'albero dei file montata dal kernel all'avvio del
-sistema; in questo caso si parla di un \textsl{pathname assoluto}
-\itindsub{pathname}{assoluto}. Altrimenti la ricerca parte dalla directory di
-lavoro corrente del processo (su cui torneremo in
-sez.~\ref{sec:file_work_dir}) ed il \textit{pathname} è detto
-\itindsub{pathname}{relativo} \textsl{pathname relativo}.
+sistema; in questo caso si parla di un \textsl{pathname assoluto}. Altrimenti
+la ricerca parte dalla directory di lavoro corrente del processo (su cui
+torneremo in sez.~\ref{sec:file_work_dir}) ed il \textit{pathname} è detto
+\textsl{pathname relativo}.
+
+\itindsubend{pathname}{assoluto}
+\itindsubend{pathname}{relativo}
Infine i nomi di directory ``\file{.}'' e ``\file{..}'' hanno un significato
speciale e vengono inseriti in ogni directory quando questa viene creata (vedi
directory}) cioè la directory che contiene il riferimento alla directory
corrente.
-In questo modo con ``\file{..}'' si può usare un \itindsub{pathname}{relativo}
-\textit{pathname} relativo per indicare un file posto al di sopra della
-directory corrente, tornando all'indietro nell'albero dei file. Questa
-retromarcia però su fermerà una volta raggiunta la directory radice, perché
-non esistendo in questo caso una directory superiore, il nome ``\file{..}''
-farà riferimento alla radice stessa.
+In questo modo con ``\file{..}'' si può usare un \textit{pathname} relativo
+per indicare un file posto al di sopra della directory corrente, tornando
+all'indietro nell'albero dei file. Questa retromarcia però su fermerà una
+volta raggiunta la directory radice, perché non esistendo in questo caso una
+directory superiore, il nome ``\file{..}'' farà riferimento alla radice
+stessa.
\itindend{pathname}
\itindend{pathname~resolution}
attraverso un filesystem, il cosiddetto \textit{raw access}, introdotto coi
kernel della serie 2.4.x ma ormai in sostanziale disuso.}
-\index{file!di~dispositivo|}
+\index{file!di~dispositivo|)}
\index{file!speciali|)}
Una differenza che attiene ai contenuti di un file però esiste, ed è relativa
disposizione della \acr{glibc}, che rendono disponibili soltanto le funzioni
in essi definite, sono illustrate nel seguente elenco:
\begin{basedescript}{\desclabelwidth{2.7cm}\desclabelstyle{\nextlinelabel}}
-\item[\macro{\_\_STRICT\_ANSI\_\_}] richiede l'aderenza stretta allo standard
+\item[\macrod{\_\_STRICT\_ANSI\_\_}] richiede l'aderenza stretta allo standard
C ISO; viene automaticamente predefinita qualora si invochi il \texttt{gcc}
con le opzione \texttt{-ansi} o \texttt{-std=c99}.
-\item[\macro{\_POSIX\_SOURCE}] definendo questa macro (considerata obsoleta)
+\item[\macrod{\_POSIX\_SOURCE}] definendo questa macro (considerata obsoleta)
si rendono disponibili tutte le funzionalità dello standard POSIX.1 (la
versione IEEE Standard 1003.1) insieme a tutte le funzionalità dello
standard ISO C. Se viene anche definita con un intero positivo la macro
\macro{\_POSIX\_C\_SOURCE} lo stato di questa non viene preso in
considerazione.
-\item[\macro{\_POSIX\_C\_SOURCE}] definendo questa macro ad un valore intero
+\item[\macrod{\_POSIX\_C\_SOURCE}] definendo questa macro ad un valore intero
positivo si controlla quale livello delle funzionalità specificate da POSIX
viene messa a disposizione; più alto è il valore maggiori sono le
funzionalità:
\item in futuro valori superiori potranno abilitare ulteriori estensioni.
\end{itemize}
-\item[\macro{\_BSD\_SOURCE}] definendo questa macro si rendono disponibili le
+\item[\macrod{\_BSD\_SOURCE}] definendo questa macro si rendono disponibili le
funzionalità derivate da BSD4.3, insieme a quelle previste dagli standard
ISO C, POSIX.1 e POSIX.2; alcune delle funzionalità previste da BSD sono
però in conflitto con le corrispondenti definite nello standard POSIX.1, in
\macro{\_DEFAULT\_SOURCE} che è definita di default, è stata deprecata a
partire dalle \acr{glibc} 2.20.
-\item[\macro{\_SVID\_SOURCE}] definendo questa macro si rendono disponibili le
+\item[\macrod{\_SVID\_SOURCE}] definendo questa macro si rendono disponibili le
funzionalità derivate da SVID. Esse comprendono anche quelle definite negli
standard ISO C, POSIX.1, POSIX.2, e X/Open (XPG$n$) illustrati in
precedenza. Questa macro, essendo ricompresa in \macro{\_DEFAULT\_SOURCE}
che è definita di default, è stata deprecata a partire dalle \acr{glibc}
2.20.
-\item[\macro{\_DEFAULT\_SOURCE}] questa macro abilita le definizioni
+\item[\macrod{\_DEFAULT\_SOURCE}] questa macro abilita le definizioni
considerate il \textit{default}, comprese quelle richieste dallo standard
POSIX.1-2008, ed è sostanzialente equivalente all'insieme di
\macro{\_SVID\_SOURCE}, \macro{\_BSD\_SOURCE} e
dalle \acr{glibc} 2.19 e consente di deprecare \macro{\_SVID\_SOURCE} e
\macro{\_BSD\_SOURCE}.
-\item[\macro{\_XOPEN\_SOURCE}] definendo questa macro si rendono disponibili
+\item[\macrod{\_XOPEN\_SOURCE}] definendo questa macro si rendono disponibili
le funzionalità descritte nella \textit{X/Open Portability Guide}. Anche
queste sono un sovrainsieme di quelle definite negli standard POSIX.1 e
POSIX.2 ed in effetti sia \macro{\_POSIX\_SOURCE} che
estensioni XSI.
\end{itemize}
-\item[\macro{\_XOPEN\_SOURCE\_EXTENDED}] definendo questa macro si rendono
+\item[\macrod{\_XOPEN\_SOURCE\_EXTENDED}] definendo questa macro si rendono
disponibili le ulteriori funzionalità necessarie ad essere conformi al
rilascio del marchio \textit{X/Open Unix} corrispondenti allo standard
Unix95, vale a dire quelle specificate da SUSv1/XPG4v2. Questa macro viene
definita implicitamente tutte le volte che si imposta
\macro{\_XOPEN\_SOURCE} ad un valore maggiore o uguale a 500.
-\item[\macro{\_ISOC99\_SOURCE}] definendo questa macro si rendono disponibili
+\item[\macrod{\_ISOC99\_SOURCE}] definendo questa macro si rendono disponibili
le funzionalità previste per la revisione delle librerie standard del C
introdotte con lo standard ISO C99. La macro è definita a partire dalla
versione 2.1.3 della \acr{glibc}.
viene tuttora riconosciuta come equivalente di \macro{\_ISOC99\_SOURCE} per
compatibilità.
-\item[\macro{\_ISOC11\_SOURCE}] definendo questa macro si rendono disponibili
+\item[\macrod{\_ISOC11\_SOURCE}] definendo questa macro si rendono disponibili
le funzionalità previste per la revisione delle librerie standard del C
introdotte con lo standard ISO C11, e abilita anche quelle previste dagli
standard C99 e C95. La macro è definita a partire dalla versione 2.16 della
\acr{glibc}.
-\item[\macro{\_GNU\_SOURCE}] definendo questa macro si rendono disponibili
+\item[\macrod{\_GNU\_SOURCE}] definendo questa macro si rendono disponibili
tutte le funzionalità disponibili nei vari standard oltre a varie estensioni
specifiche presenti solo nella \acr{glibc} ed in Linux. Gli standard coperti
sono: ISO C89, ISO C99, POSIX.1, POSIX.2, BSD, SVID, X/Open, SUS.
\begin{basedescript}{\desclabelwidth{2.7cm}\desclabelstyle{\nextlinelabel}}
-\item[\macro{\_LARGEFILE\_SOURCE}] definendo questa macro si rendono
+\item[\macrod{\_LARGEFILE\_SOURCE}] definendo questa macro si rendono
disponibili alcune funzioni che consentono di superare una inconsistenza
presente negli standard con i file di grandi dimensioni, ed in particolare
definire le due funzioni \func{fseeko} e \func{ftello} che al contrario
delle corrispettive \func{fseek} e \func{ftell} usano il tipo di dato
specifico \ctyp{off\_t} (vedi sez.~\ref{sec:file_io}).
-\item[\macro{\_LARGEFILE64\_SOURCE}] definendo questa macro si rendono
+\item[\macrod{\_LARGEFILE64\_SOURCE}] definendo questa macro si rendono
disponibili le funzioni di una interfaccia alternativa al supporto di valori
a 64 bit nelle funzioni di gestione dei file (non supportati in certi
sistemi), caratterizzate dal suffisso \texttt{64} aggiunto ai vari nomi di
di \texttt{64} consente di usare in maniera trasparente le funzioni
dell'interfaccia classica.
-\item[\macro{\_FILE\_OFFSET\_BITS}] la definizione di questa macro al valore
+\item[\macrod{\_FILE\_OFFSET\_BITS}] la definizione di questa macro al valore
di \texttt{64} consente di attivare la conversione automatica di tutti i
riferimenti a dati e funzioni a 32 bit nelle funzioni di interfaccia ai file
con le equivalenti a 64 bit, senza dover utilizzare esplicitamente
dimensioni. Su sistemi a 64 bit invece, dove il problema non sussiste, la
macro non ha nessun effetto.
-\item[\macro{\_ATFILE\_SOURCE}] definendo questa macro si rendono disponibili
+\item[\macrod{\_ATFILE\_SOURCE}] definendo questa macro si rendono disponibili
le estensioni delle funzioni di creazione, accesso e modifica di file e
directory che risolvono i problemi di sicurezza insiti nell'uso di
\textit{pathname} relativi con programmi \textit{multi-thread} illustrate in
sez.~\ref{sec:file_openat}.
-\item[\macro{\_REENTRANT}] definendo questa macro, o la equivalente
+\item[\macrod{\_REENTRANT}] definendo questa macro, o la equivalente
\macro{\_THREAD\_SAFE} (fornita per compatibilità) si rendono disponibili le
versioni rientranti (vedi sez.~\ref{sec:proc_reentrant}) di alcune funzioni,
necessarie quando si usano i \textit{thread}. Alcune di queste funzioni
disponibili soltanto su alcuni sistemi, o specifiche della \acr{glibc}, e
possono essere utilizzate una volta definita la macro.
-\item[\macro{\_FORTIFY\_SOURCE}] definendo questa macro viene abilitata
+\item[\macrod{\_FORTIFY\_SOURCE}] definendo questa macro viene abilitata
l'inserimento di alcuni controlli per alcune funzioni di allocazione e
manipolazione di memoria e stringhe che consentono di rilevare
automaticamente alcuni errori di \textit{buffer overflow} nell'uso delle
lettura. Infine è possibile anche usare la \textit{fifo} all'interno di un
solo processo, nel qual caso però occorre stare molto attenti alla possibili
situazioni di stallo: se si cerca di leggere da una \textit{fifo} che non
-contiene dati si avrà infatti un \itindex{deadlock} \textit{deadlock}
-immediato, dato che il processo si blocca e quindi non potrà mai eseguire le
-funzioni di scrittura.
+contiene dati si avrà infatti un \textit{deadlock} immediato, dato che il
+processo si blocca e quindi non potrà mai eseguire le funzioni di scrittura.
Per la loro caratteristica di essere accessibili attraverso il filesystem, è
piuttosto frequente l'utilizzo di una \textit{fifo} come canale di
\includestruct{listati/semun.h}
\end{minipage}
\normalsize
- \caption{La definizione dei possibili valori di una \direct{union}
+ \caption{La definizione dei possibili valori di una \dirct{union}
\structd{semun}, usata come quarto argomento della funzione
\func{semctl}.}
\label{fig:ipc_semun}
sbloccata, cosicché un altro processo (o \itindex{thread} \textit{thread})
eventualmente bloccato in una \func{sem\_wait} sul semaforo possa essere
svegliato e rimesso in esecuzione. Si tenga presente che la funzione è sicura
-\index{funzioni!sicure} per l'uso all'interno di un gestore di segnali (si
-ricordi quanto detto in sez.~\ref{sec:sig_signal_handler}).
+per l'uso all'interno di un gestore di segnali (si ricordi quanto detto in
+sez.~\ref{sec:sig_signal_handler}).
Se invece di operare su un semaforo se ne volesse semplicemente leggere il
valore, si potrà usare la funzione \funcd{sem\_getvalue}, il cui prototipo è:
}
\newcommand{\funcd}[1]{%
-\index{funzione!{#1}@{{\tt {#1}}}!definizione di}\texttt{#1}%
+\index{funzione!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{funzione!{#1}@{{\tt {#1}}}!definizione di}\texttt{#1}%
%\index{#1@{{\tt {#1}} (funzione)}!definizione di}\texttt{#1}%
}
\newcommand{\funcm}[1]{%
-\index{funzione!{#1}@{{\tt {#1}}}!menzione di}\texttt{#1}%
+\index{funzione!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{funzione!{#1}@{{\tt {#1}}}!menzione di}\texttt{#1}%
%\index{#1@{{\tt {#1}} (funzione)}!definizione di}\texttt{#1}%
}
\newcommand{\macro}[1]{%
+\texttt{#1}%
+%\index{macro!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (macro)}}\texttt{#1}%
+}
+
+\newcommand{\macrod}[1]{%
\index{macro!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (macro)}}\texttt{#1}%
}
+\newcommand{\macrobeg}[1]{%
+\index{macro!{#1}@{{\tt {#1}}}|(}%
+%\index{#1@{{\tt {#1}} (macro)}}\texttt{#1}%
+}
+\newcommand{\macroend}[1]{%
+\index{macro!{#1}@{{\tt {#1}}}|)}%
+%\index{#1@{{\tt {#1}} (macro)}}\texttt{#1}%
+}
+
\newcommand{\errcode}[1]{%
\texttt{#1}%
%\index{errore!{#1}@{{\tt {#1}}}}\texttt{#1}%
\newcommand{\val}[1]{\texttt{#1}} % value
\newcommand{\signal}[1]{%
+\texttt{#1}%
+%\index{segnale!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (costante)}}\texttt{#1}%
+} % constant name
+
+\newcommand{\signald}[1]{%
\index{segnale!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (costante)}}\texttt{#1}%
} % constant name
-\newcommand{\const}[1]{%
+\newcommand{\constd}[1]{%
\index{costante!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (costante)}}\texttt{#1}%
} % constant name
+\newcommand{\constbeg}[1]{%
+\index{costante!{#1}@{{\tt {#1}}}|(}%
+%\index{#1@{{\tt {#1}} (costante)}}\texttt{#1}%
+} % constant name
+\newcommand{\constend}[1]{%
+\index{costante!{#1}@{{\tt {#1}}}|)}%
+%\index{#1@{{\tt {#1}} (costante)}}\texttt{#1}%
+} % constant name
+
+\newcommand{\const}[1]{%
+\texttt{#1}%
+%\index{costante!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (costante)}}\texttt{#1}%
+} % constant name
+
\newcommand{\instruction}[1]{%
\index{istruzione linguaggio C!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
-} % constant name
+} % instruction name
+
+\newcommand{\instr}[1]{\texttt{#1}} % instruction
\newcommand{\direct}[1]{%
\index{direttiva linguaggio C!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
-} % constant name
+} % directive name
+
+\newcommand{\dirct}[1]{\texttt{#1}} % directive
+
\newcommand{\file}[1]{\texttt{#1}} % file name
\newcommand{\link}[1]{\texttt{#1}} % html link
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
} % system file name
\newcommand{\conffile}[1]{%
+\texttt{#1}%
+%\index{file!di~configurazione!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % configuration file name
+\newcommand{\conffiled}[1]{%
\index{file!di~configurazione!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
} % configuration file name
+\newcommand{\conffilebeg}[1]{%
+\index{file!di~configurazione!{#1}@{{\tt {#1}}}}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % configuration file name
+\newcommand{\conffileend}[1]{%
+\index{file!di~configurazione!{#1}@{{\tt {#1}}}}%
+%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
+} % configuration file name
\newcommand{\procrelfile}[2]{%
\index{file!filesystem~\texttt{/proc}!{#1/#2}@{{\tt {#1/#2}}}}\texttt{#2}%
%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}%
\newcommand{\kstruct}[1]{%
-\index{struttura dati del kernel!{#1}@{{\tt {#1}}}}\texttt{#1}%
+\texttt{#1}%
+%\index{struttura dati del kernel!{#1}@{{\tt {#1}}}}\texttt{#1}%
%\index{#1@{{\tt {#1}} (struttura dati)}}\texttt{#1}%
} % struttura dati
\newcommand{\kstructd}[1]{%
-\index{struttura dati del kernel!{#1}@{{\tt {#1}}}!definizione di}\texttt{#1}%
+\index{struttura dati del kernel!{#1}@{{\tt {#1}}}}\texttt{#1}%
+%\index{struttura dati del kernel!{#1}@{{\tt {#1}}}!definizione di}\texttt{#1}%
%\index{#1@{{\tt {#1}} (struttura dati)}!definizione di}\texttt{#1}%
} % struttura dati
\newcommand{\type}[1]{%
\newcommand{\itindsub}[2]{%
\index{#1@{\textit{#1}}!\textit{#2}}%
}
+\newcommand{\itindsubbeg}[2]{%
+\index{#1@{\textit{#1}}!\textit{#2}}%
+}
+\newcommand{\itindsubend}[2]{%
+\index{#1@{\textit{#1}}!\textit{#2}}%
+}
% Aggiunte di Mirko per la gestione delle tabelle complicate come immagini
% nella traslazione in HTML
segue le specifiche del \textit{Filesystem Hierarchy Standard} (per maggiori
informazioni si consulti sez.~1.2.3 di \cite{AGL}) si trovano sotto
\texttt{/usr/include}.} o fra virgolette, nel qual caso si fa riferimento
-ad una versione locale, da indicare con un \itindsub{pathname}{relativo}
-\textit{pathname} relativo:
+ad una versione locale, da indicare con un \textit{pathname} relativo:
\includecodesnip{listati/main_include.c}
Si tenga presente che oltre ai nomi riservati a livello generale di cui si è
verrebbe interpretato come un successo.
Per questo motivo in \headfile{stdlib.h} sono definite, seguendo lo standard
-POSIX, le due costanti \const{EXIT\_SUCCESS} e \const{EXIT\_FAILURE}, da usare
-sempre per specificare lo stato di uscita di un processo. Su Linux, ed in
-generale in qualunque sistema POSIX, ad esse sono assegnati rispettivamente i
-valori 0 e 1.
+POSIX, le due costanti \constd{EXIT\_SUCCESS} e \constd{EXIT\_FAILURE}, da
+usare sempre per specificare lo stato di uscita di un processo. Su Linux, ed
+in generale in qualunque sistema POSIX, ad esse sono assegnati rispettivamente
+i valori 0 e 1.
\itindend{exit~status}
programma. A questo scopo lo standard ANSI C prevede la possibilità di
registrare un certo numero di funzioni che verranno eseguite all'uscita dal
programma,\footnote{nel caso di \func{atexit} lo standard POSIX.1-2001
- richiede che siano registrabili almeno \const{ATEXIT\_MAX} funzioni (il
+ richiede che siano registrabili almeno \constd{ATEXIT\_MAX} funzioni (il
valore può essere ottenuto con \func{sysconf}, vedi
sez.~\ref{sec:sys_limits}).} sia per la chiamata ad \func{exit} che per il
ritorno di \code{main}. La prima funzione che si può utilizzare a tal fine è
anche utilizzare pagine di dimensioni maggiori (di 4Mb, dette \textit{huge
page}), per sistemi con grandi quantitativi di memoria in cui l'uso di
pagine troppo piccole comporta una perdita di prestazioni. In alcuni sistemi
-la costante \const{PAGE\_SIZE}, definita in \headfile{limits.h}, indica la
+la costante \constd{PAGE\_SIZE}, definita in \headfile{limits.h}, indica la
dimensione di una pagina in byte, con Linux questo non avviene e per ottenere
questa dimensione si deve ricorrere alla funzione \func{getpagesize} (vedi
sez.~\ref{sec:sys_memory_res}).
indirizzi virtuali ai quali il processo può accedere. Solitamente un
programma C viene suddiviso nei seguenti segmenti:
\index{segmento!testo|(}
-\index{segmento!dati(}
+\index{segmento!dati|(}
\itindbeg{heap}
\itindbeg{stack}
-\begin{enumerate*}
+\begin{enumerate}
\item Il \textsl{segmento di testo} o \textit{text segment}. Contiene il
codice del programma, delle funzioni di librerie da esso utilizzate, e le
costanti. Normalmente viene condiviso fra tutti i processi che eseguono lo
globale è che essa può essere vista solo all'interno della funzione in cui
è dichiarata.} e la memoria allocata dinamicamente. Di norma è diviso in
tre parti:
- \begin{itemize*}
+ \begin{itemize}
\item Il segmento dei dati inizializzati, che contiene le variabili il cui
valore è stato assegnato esplicitamente. Ad esempio se si definisce:
\includecodesnip{listati/pi.c}
disallocare la memoria dinamica con le apposite funzioni (vedi
sez.~\ref{sec:proc_mem_alloc}), ma il suo limite inferiore, quello
adiacente al segmento dei dati non inizializzati, ha una posizione fissa.
- \end{itemize*}
+ \end{itemize}
\item Il segmento di \textit{stack}, che contiene quello che viene chiamato lo
``\textit{stack}'' del programma. Tutte le volte che si effettua una
chiamata ad una funzione è qui che viene salvato l'indirizzo di ritorno e le
La dimensione di questo segmento aumenta seguendo la crescita dello
\textit{stack} del programma, ma non viene ridotta quando quest'ultimo si
restringe.
-\end{enumerate*}
+\end{enumerate}
\begin{figure}[htb]
\centering
inizializzato a zero al caricamento del programma.
\index{segmento!testo|)}
-\index{segmento!dati)}
+\index{segmento!dati|)}
\itindend{heap}
\itindend{stack}
momento, in corrispondenza ad una qualunque chiamata di \func{malloc} che può
essere in una sezione del codice che non ha alcuna relazione con la funzione
che contiene l'errore. Per questo motivo è sempre molto difficile trovare un
-\textit{memory leak}.
-
-In C e C++ il problema è particolarmente sentito. In C++, per mezzo della
-programmazione ad oggetti, il problema dei \textit{memory leak} si può
-notevolmente ridimensionare attraverso l'uso accurato di appositi oggetti come
-gli \textit{smartpointers}. Questo però in genere va a scapito delle
-prestazioni dell'applicazione in esecuzione.
-
-% TODO decidere cosa fare di questo che segue
-% In altri linguaggi come il java e recentemente il C\# il problema non si pone
-% nemmeno perché la gestione della memoria viene fatta totalmente in maniera
-% automatica, ovvero il programmatore non deve minimamente preoccuparsi di
-% liberare la memoria allocata precedentemente quando non serve più, poiché
-% l'infrastruttura del linguaggio gestisce automaticamente la cosiddetta
-% \index{\textit{garbage~collection}} \textit{garbage collection}. In tal caso,
-% attraverso meccanismi simili a quelli del \textit{reference counting}, quando
-% una zona di memoria precedentemente allocata non è più riferita da nessuna
-% parte del codice in esecuzione, può essere deallocata automaticamente in
-% qualunque momento dall'infrastruttura.
+\textit{memory leak}. In C e C++ il problema è particolarmente sentito. In
+C++, per mezzo della programmazione ad oggetti, il problema dei \textit{memory
+ leak} si può notevolmente ridimensionare attraverso l'uso accurato di
+appositi oggetti come gli \textit{smartpointers}. Questo però in genere va a
+scapito delle prestazioni dell'applicazione in esecuzione.
+
+% TODO decidere cosa fare di questo che segue In altri linguaggi come il java
+% e recentemente il C\# il problema non si pone nemmeno perché la gestione
+% della memoria viene fatta totalmente in maniera automatica, ovvero il
+% programmatore non deve minimamente preoccuparsi di liberare la memoria
+% allocata precedentemente quando non serve più, poiché l'infrastruttura del
+% linguaggio gestisce automaticamente la cosiddetta
+% \itindex{garbage~collection} \textit{garbage collection}. In tal caso,
+% attraverso meccanismi simili a quelli del \textit{reference counting},
+% quando una zona di memoria precedentemente allocata non è più riferita da
+% nessuna parte del codice in esecuzione, può essere deallocata
+% automaticamente in qualunque momento dall'infrastruttura.
% Anche questo va a scapito delle prestazioni dell'applicazione in esecuzione
% (inoltre le applicazioni sviluppate con tali linguaggi di solito non sono
non è inserita né nello standard POSIX né in SUSv3 (ma è presente in BSD), il
suo utilizzo quindi limita la portabilità dei programmi. Inoltre la funzione
non può essere usata nella lista degli argomenti di una funzione, perché lo
-spazio verrebbe allocato nel mezzo degli stessi. Inoltre non è chiaramente
+spazio verrebbe allocato nel mezzo degli stessi. Inoltre non è chiaramente
possibile usare \func{alloca} per allocare memoria che deve poi essere usata
anche al di fuori della funzione in cui essa viene chiamata, dato che
all'uscita dalla funzione lo spazio allocato diventerebbe libero, e potrebbe
\textit{segment violation} la prima volta che cercherà di accedere alla
memoria non effettivamente disponibile.
-
\index{segmento!dati|(}
\itindbeg{heap}
La funzione è un'interfaccia all'omonima \textit{system call} ed imposta
l'indirizzo finale del segmento dati di un processo (più precisamente dello
\textit{heap}) all'indirizzo specificato da \param{addr}. Quest'ultimo deve
-essere un valore ragionevole, e la dimensione totale non deve comunque
-eccedere un eventuale limite (vedi sez.~\ref{sec:sys_resource_limit}) imposto
-sulle dimensioni massime del segmento dati del processo.
+essere un valore ragionevole e la dimensione totale non deve comunque eccedere
+un eventuale limite (vedi sez.~\ref{sec:sys_resource_limit}) sulle dimensioni
+massime del segmento dati del processo.
Il valore di ritorno della funzione fa riferimento alla versione fornita dalla
\acr{glibc}, in realtà in Linux la \textit{system call} corrispondente
Il sistema pone dei limiti all'ammontare di memoria di un processo che può
essere bloccata e al totale di memoria fisica che si può dedicare a questo, lo
standard POSIX.1 richiede che sia definita in \headfile{unistd.h} la macro
-\macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il
+\macrod{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il
\textit{memory locking}.
Siccome la richiesta di un \textit{memory lock} da parte di un processo riduce
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{MCL\_CURRENT}& blocca tutte le pagine correntemente mappate nello
- spazio di indirizzi del processo.\\
- \const{MCL\_FUTURE} & blocca tutte le pagine che verranno mappate nello
- spazio di indirizzi del processo.\\
+ \constd{MCL\_CURRENT}& blocca tutte le pagine correntemente mappate nello
+ spazio di indirizzi del processo.\\
+ \constd{MCL\_FUTURE} & blocca tutte le pagine che verranno mappate nello
+ spazio di indirizzi del processo.\\
\hline
\end{tabular}
\caption{Valori e significato dell'argomento \param{flags} della funzione
\textbf{Valore} & \textbf{Significato} \\
\hline
\hline
- \const{MCHECK\_OK} & Riportato a \func{mprobe} se nessuna
- inconsistenza è presente.\\
- \const{MCHECK\_DISABLED}& Riportato a \func{mprobe} se si è chiamata
- \func{mcheck} dopo aver già usato
- \func{malloc}.\\
- \const{MCHECK\_HEAD} & I dati immediatamente precedenti il buffer sono
- stati modificati, avviene in genere quando si
- decrementa eccessivamente il valore di un
- puntatore scrivendo poi prima dell'inizio del
- buffer.\\
- \const{MCHECK\_TAIL} & I dati immediatamente seguenti il buffer sono
- stati modificati, succede quando si va scrivere
- oltre la dimensione corretta del buffer.\\
- \const{MCHECK\_FREE} & Il buffer è già stato disallocato.\\
+ \constd{MCHECK\_OK} & Riportato a \func{mprobe} se nessuna
+ inconsistenza è presente.\\
+ \constd{MCHECK\_DISABLED}& Riportato a \func{mprobe} se si è chiamata
+ \func{mcheck} dopo aver già usato
+ \func{malloc}.\\
+ \constd{MCHECK\_HEAD} & I dati immediatamente precedenti il buffer sono
+ stati modificati, avviene in genere quando si
+ decrementa eccessivamente il valore di un
+ puntatore scrivendo poi prima dell'inizio del
+ buffer.\\
+ \constd{MCHECK\_TAIL} & I dati immediatamente seguenti il buffer sono
+ stati modificati, succede quando si va scrivere
+ oltre la dimensione corretta del buffer.\\
+ \constd{MCHECK\_FREE} & Il buffer è già stato disallocato.\\
\hline
\end{tabular}
\caption{Valori dello stato dell'allocazione di memoria ottenibili dalla
opzioni sono spostati in coda al vettore. Oltre a questa esistono altre due
modalità di gestire gli elementi di \param{argv}; se \param{optstring} inizia
con il carattere ``\texttt{+}'' (o è impostata la variabile di ambiente
-\macro{POSIXLY\_CORRECT}) la scansione viene fermata non appena si incontra un
+\cmd{POSIXLY\_CORRECT}) la scansione viene fermata non appena si incontra un
elemento che non è un'opzione.
L'ultima modalità, usata quando un programma può gestire la mescolanza fra
\subsection{Il passaggio di un numero variabile di argomenti}
\label{sec:proc_variadic}
-\index{funzioni!variadic|(}
+\index{funzioni!\textit{variadic}|(}
Come vedremo nei capitoli successivi, non sempre è possibile specificare un
numero fisso di argomenti per una funzione. Lo standard ISO C prevede nella
pertanto quella sequenziale, in cui vengono estratti dallo \textit{stack}
secondo l'ordine in cui sono stati scritti nel prototipo della funzione.
+\macrobeg{va\_start}
+
Per fare questo in \headfile{stdarg.h} sono definite delle macro specifiche,
previste dallo standard ISO C89, che consentono di eseguire questa operazione.
La prima di queste macro è \macro{va\_start}, che inizializza opportunamente
parametro \param{last} deve indicare il nome dell'ultimo degli argomenti fissi
dichiarati nel prototipo della funzione \textit{variadic}.
+\macrobeg{va\_arg}
+
La seconda macro di gestione delle liste di argomenti di una funzione
\textit{variadic} è \macro{va\_arg}, che restituisce in successione un
argomento della lista; la sua definizione è:
risultati indefiniti anche quando si chiama \macro{va\_arg} specificando un
tipo che non corrisponde a quello usato per il corrispondente argomento.
+\macrobeg{va\_end}
+
Infine una volta completata l'estrazione occorre indicare che si sono concluse
-le operazioni con la macro \macro{va\_end}, la cui definizione è:
+le operazioni con la macro \macrod{va\_end}, la cui definizione è:
{\centering
\begin{funcbox}{
(anche se non si era completata l'estrazione) dato che il valore di \param{ap}
risulterebbe indefinito.
+\macroend{va\_start}
+\macroend{va\_arg}
+\macroend{va\_end}
+
Esistono dei casi in cui è necessario eseguire più volte la scansione degli
argomenti e poter memorizzare una posizione durante la stessa. In questo caso
sembrerebbe naturale copiarsi la lista degli argomenti \param{ap} con una
Per questo motivo una variabile di tipo \type{va\_list} non può essere
assegnata direttamente ad un'altra variabile dello stesso tipo, ma lo standard
ISO C99\footnote{alcuni sistemi che non hanno questa macro provvedono al suo
- posto \macro{\_\_va\_copy} che era il nome proposto in una bozza dello
+ posto \macrod{\_\_va\_copy} che era il nome proposto in una bozza dello
standard.} ha previsto una macro ulteriore che permette di eseguire la
copia di una lista degli argomenti:
La macro copia l'attuale della lista degli argomenti \param{src} su una nuova
lista \param{dest}. Anche in questo caso è buona norma chiudere ogni
-esecuzione di una \macro{va\_copy} con una corrispondente \macro{va\_end} sul
+esecuzione di una \macrod{va\_copy} con una corrispondente \macro{va\_end} sul
nuovo puntatore alla lista degli argomenti.
La chiamata di una funzione con un numero variabile di argomenti, posto che la
usa un puntatore \val{NULL} per indicare la fine della lista degli argomenti
(vedi sez.~\ref{sec:proc_exec}).
-\index{funzioni!variadic|)}
+\index{funzioni!\textit{variadic}|)}
\subsection{Il controllo di flusso non locale}
\label{sec:proc_longjmp}
specificato 0 sarà comunque restituito 1 al suo posto.
In sostanza l'esecuzione di \func{longjmp} è analoga a quella di una
-istruzione \instruction{return}, solo che invece di ritornare alla riga
+istruzione \instr{return}, solo che invece di ritornare alla riga
successiva della funzione chiamante, il programma in questo caso ritorna alla
posizione della relativa \func{setjmp}. L'altra differenza fondamentale con
-\instruction{return} è che il ritorno può essere effettuato anche attraverso
+\instr{return} è che il ritorno può essere effettuato anche attraverso
diversi livelli di funzioni annidate.
L'implementazione di queste funzioni comporta alcune restrizioni dato che esse
In generale, dato che l'unica differenza fra la chiamata diretta e quella
ottenuta nell'uscita con un \func{longjmp} è costituita dal valore di ritorno
di \func{setjmp}, pertanto quest'ultima viene usualmente chiamata all'interno
-di un una istruzione \instruction{if} che permetta di distinguere i due casi.
+di un una istruzione \instr{if} che permetta di distinguere i due casi.
Uno dei punti critici dei salti non-locali è quello del valore delle
variabili, ed in particolare quello delle variabili automatiche della funzione
a cui si ritorna. In generale le variabili globali e statiche mantengono i
valori che avevano al momento della chiamata di \func{longjmp}, ma quelli
-delle variabili automatiche (o di quelle dichiarate \direct{register}) sono in
+delle variabili automatiche (o di quelle dichiarate \dirct{register}) sono in
genere indeterminati.
Quello che succede infatti è che i valori delle variabili che sono tenute in
bit, arriva ad un massimo di 32768. Oltre questo valore l'assegnazione
riparte dal numero più basso disponibile a partire da un minimo di
300,\footnote{questi valori, fino al kernel 2.4.x, erano definiti dalla macro
- \const{PID\_MAX} nei file \file{threads.h} e \file{fork.c} dei sorgenti del
+ \constd{PID\_MAX} nei file \file{threads.h} e \file{fork.c} dei sorgenti del
kernel, con il 2.6.x e la nuova interfaccia per i \textit{thread} anche il
meccanismo di allocazione dei \ids{PID} è stato modificato ed il valore
massimo è impostabile attraverso il file \sysctlfile{kernel/pid\_max} e di
$<-1$& -- & Attende per un figlio il cui \textit{process
group} (vedi sez.~\ref{sec:sess_proc_group}) è
uguale al valore assoluto di \param{pid}.\\
- $-1$&\const{WAIT\_ANY} & Attende per un figlio qualsiasi, usata in
- questa maniera senza specificare nessuna opzione
- è equivalente a \func{wait}.\\
- $ 0$&\const{WAIT\_MYPGRP}&Attende per un figlio il cui \textit{process
+ $-1$&\constd{WAIT\_ANY} & Attende per un figlio qualsiasi, usata in
+ questa maniera senza specificare nessuna opzione
+ è equivalente a \func{wait}.\\
+ $ 0$&\constd{WAIT\_MYPGRP}&Attende per un figlio il cui \textit{process
group} (vedi sez.~\ref{sec:sess_proc_group}) è
- uguale a quello del processo chiamante.\\
+ uguale a quello del processo chiamante.\\
$>0$& -- & Attende per un figlio il cui \ids{PID} è uguale
al valore di \param{pid}.\\
\hline
fermato ha ripreso l'esecuzione (disponibile solo a
partire dal kernel 2.6.10).\\
\hline
- \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone}
+ \constd{\_\_WCLONE}& Attende solo per i figli creati con \func{clone}
(vedi sez.~\ref{sec:process_clone}), vale a dire
processi che non emettono nessun segnale
o emettono un segnale diverso da \signal{SIGCHLD} alla
terminazione, il default è attendere soltanto i
processi figli ordinari ignorando quelli creati da
\func{clone}.\\
- \const{\_\_WALL} & Attende per qualunque figlio, sia ordinario che creato
+ \constd{\_\_WALL} & Attende per qualunque figlio, sia ordinario che creato
con \func{clone}, se specificata insieme a
\const{\_\_WCLONE} quest'ultima viene ignorata. \\
- \const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
+ \constd{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
dello stesso \textit{thread group}, questo era il
comportamento di default del kernel 2.4 che non
supportava la possibilità, divenuta il default a
\label{tab:proc_waitpid_options}
\end{table}
+\constbeg{WNOHANG}
L'uso dell'opzione \const{WNOHANG} consente di prevenire il blocco della
funzione qualora nessun figlio sia uscito o non si siano verificate le altre
invece di restituire il \ids{PID} del processo (che è sempre un intero
positivo) ritornerà un valore nullo.
+\constend{WNOHANG}
+\constbeg{WUNTRACED}
+\constbeg{WCONTINUED}
+
Le altre due opzioni, \const{WUNTRACED} e \const{WCONTINUED}, consentono
rispettivamente di tracciare non la terminazione di un processo, ma il fatto
che esso sia stato fermato, o fatto ripartire, e sono utilizzate per la
\signal{SIGCONT} (l'uso di questi segnali per il controllo di sessione è
trattato in sez.~\ref{sec:sess_ctrl_term}).
+\constend{WUNTRACED}
+\constend{WCONTINUED}
+
La terminazione di un processo figlio (così come gli altri eventi osservabili
con \func{waitpid}) è chiaramente un evento asincrono rispetto all'esecuzione
di un programma e può avvenire in un qualunque momento. Per questo motivo,
\textbf{Macro} & \textbf{Descrizione}\\
\hline
\hline
- \macro{WIFEXITED}\texttt{(s)} & Condizione vera (valore non nullo) per
+ \macrod{WIFEXITED}\texttt{(s)} & Condizione vera (valore non nullo) per
un processo figlio che sia terminato
normalmente. \\
- \macro{WEXITSTATUS}\texttt{(s)} & Restituisce gli otto bit meno
+ \macrod{WEXITSTATUS}\texttt{(s)} & Restituisce gli otto bit meno
significativi dello stato di uscita del
processo (passato attraverso
\func{\_exit}, \func{exit} o come valore
di ritorno di \code{main}); può essere
valutata solo se \val{WIFEXITED} ha
restituito un valore non nullo.\\
- \macro{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è
+ \macrod{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è
terminato in maniera anomala a causa di
un segnale che non è stato catturato
(vedi sez.~\ref{sec:sig_notification}).\\
- \macro{WTERMSIG}\texttt{(s)} & Restituisce il numero del segnale che ha
+ \macrod{WTERMSIG}\texttt{(s)} & Restituisce il numero del segnale che ha
causato la terminazione anomala del
processo; può essere valutata solo se
\val{WIFSIGNALED} ha restituito un
valore non nullo.\\
- \macro{WCOREDUMP}\texttt{(s)} & Vera se il processo terminato ha
+ \macrod{WCOREDUMP}\texttt{(s)} & Vera se il processo terminato ha
generato un file di
\textit{core dump}; può essere valutata
solo se \val{WIFSIGNALED} ha restituito
un valore non nullo.\footnotemark \\
- \macro{WIFSTOPPED}\texttt{(s)} & Vera se il processo che ha causato il
+ \macrod{WIFSTOPPED}\texttt{(s)} & Vera se il processo che ha causato il
ritorno di \func{waitpid} è bloccato;
l'uso è possibile solo con
\func{waitpid} avendo specificato
l'opzione \const{WUNTRACED}.\\
- \macro{WSTOPSIG}\texttt{(s)} & Restituisce il numero del segnale che ha
+ \macrod{WSTOPSIG}\texttt{(s)} & Restituisce il numero del segnale che ha
bloccato il processo; può essere
valutata solo se \val{WIFSTOPPED} ha
restituito un valore non nullo. \\
- \macro{WIFCONTINUED}\texttt{(s)}& Vera se il processo che ha causato il
+ \macrod{WIFCONTINUED}\texttt{(s)}& Vera se il processo che ha causato il
ritorno è stato riavviato da un
\signal{SIGCONT} (disponibile solo a
partire dal kernel 2.6.10).\\
\textbf{Valore} & \textbf{Descrizione}\\
\hline
\hline
- \const{P\_PID} & Indica la richiesta di attendere per un processo figlio
- il cui \ids{PID} corrisponda al valore dell'argomento
- \param{id}.\\
- \const{P\_PGID}& Indica la richiesta di attendere per un processo figlio
- appartenente al \textit{process group} (vedi
- sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid}
- corrisponda al valore dell'argomento \param{id}.\\
- \const{P\_ALL} & Indica la richiesta di attendere per un processo figlio
- generico, il valore dell'argomento \param{id} viene
- ignorato.\\
+ \constd{P\_PID} & Indica la richiesta di attendere per un processo figlio
+ il cui \ids{PID} corrisponda al valore dell'argomento
+ \param{id}.\\
+ \constd{P\_PGID}& Indica la richiesta di attendere per un processo figlio
+ appartenente al \textit{process group} (vedi
+ sez.~\ref{sec:sess_proc_group}) il cui \acr{pgid}
+ corrisponda al valore dell'argomento \param{id}.\\
+ \constd{P\_ALL} & Indica la richiesta di attendere per un processo figlio
+ generico, il valore dell'argomento \param{id} viene
+ ignorato.\\
\hline
\end{tabular}
\caption{Costanti per i valori dell'argomento \param{idtype} della funzione
\textbf{Valore} & \textbf{Descrizione}\\
\hline
\hline
- \const{WEXITED} & Ritorna quando un processo figlio è terminato.\\
- \const{WNOHANG} & Ritorna immediatamente anche se non c'è niente da
- notificare.\\
- \const{WSTOPPED} & Ritorna quando un processo figlio è stato fermato.\\
- \const{WCONTINUED}& Ritorna quando un processo figlio che era stato
- fermato ha ripreso l'esecuzione.\\
- \const{WNOWAIT} & Lascia il processo ancora in attesa di ricezione, così
- che una successiva chiamata possa di nuovo riceverne
- lo stato.\\
+ \constd{WEXITED} & Ritorna quando un processo figlio è terminato.\\
+ \constd{WNOHANG} & Ritorna immediatamente anche se non c'è niente da
+ notificare.\\
+ \constd{WSTOPPED} & Ritorna quando un processo figlio è stato fermato.\\
+ \constd{WCONTINUED}& Ritorna quando un processo figlio che era stato
+ fermato ha ripreso l'esecuzione.\\
+ \constd{WNOWAIT} & Lascia il processo ancora in attesa di ricezione, così
+ che una successiva chiamata possa di nuovo riceverne
+ lo stato.\\
\hline
\end{tabular}
\caption{Costanti che identificano i bit dell'argomento \param{options}
\cmd{noexec}, o manca il permesso di attraversamento di una delle
directory del \textit{pathname}.
\item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento
- \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un
+ \const{PT\_INTERP}, cioè chiede di essere eseguito da più di un
interprete.
\item[\errcode{ELIBBAD}] un interprete ELF non è in un formato
riconoscibile.
dell'eseguibile; il formato è ormai in completo disuso, per cui è molto
probabile che non il relativo supporto non sia disponibile. Se il programma è
in formato ELF per caricare le librerie dinamiche viene usato l'interprete
-indicato nel segmento \const{PT\_INTERP} previsto dal formato stesso, in
+indicato nel segmento \constd{PT\_INTERP} previsto dal formato stesso, in
genere questo è \sysfile{/lib/ld-linux.so.1} per programmi collegati con la
\acr{libc5}, e \sysfile{/lib/ld-linux.so.2} per programmi collegati con la
\acr{glibc}.
stringa viene troncata; altri Unix hanno dimensioni massime diverse, e diversi
comportamenti, ad esempio FreeBSD esegue la scansione della riga e la divide
nei vari argomenti e se è troppo lunga restituisce un errore di
-\const{ENAMETOOLONG}; una comparazione dei vari comportamenti sui diversi
+\errval{ENAMETOOLONG}; una comparazione dei vari comportamenti sui diversi
sistemi unix-like si trova su
\url{http://www.in-ulm.de/~mascheck/various/shebang/}.
Questo in Linux viene fatto usando altri due gruppi di identificatori, il
\textit{saved} ed il \textit{filesystem}. Il primo gruppo è lo stesso usato in
-SVr4, e previsto dallo standard POSIX quando è definita la costante
+SVr4, e previsto dallo standard POSIX quando è definita
\macro{\_POSIX\_SAVED\_IDS},\footnote{in caso si abbia a cuore la portabilità
del programma su altri Unix è buona norma controllare sempre la
disponibilità di queste funzioni controllando se questa costante è
almeno \const{NGROUPS\_MAX} gruppi supplementari\footnote{il numero massimo di
gruppi secondari può essere ottenuto con \func{sysconf} (vedi
sez.~\ref{sec:sys_limits}), leggendo il parametro
- \texttt{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono
+ \const{\_SC\_NGROUPS\_MAX}.} in aggiunta al gruppo primario; questi vengono
ereditati dal processo padre e possono essere cambiati con queste funzioni.
La funzione di sistema che permette di leggere i gruppi supplementari
Infine per impostare i gruppi supplementari di un processo ci sono due
funzioni, che possono essere usate solo se si hanno i privilegi di
amministratore.\footnote{e più precisamente se si ha la \textit{capability}
- \macro{CAP\_SETGID}.} La prima delle due è la funzione di sistema
+ \const{CAP\_SETGID}.} La prima delle due è la funzione di sistema
\funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4, ma a
differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per
poterla utilizzare deve essere definita la macro \macro{\_BSD\_SOURCE}.} ed
La funzione esegue la scansione del database dei gruppi (usualmente
\conffile{/etc/group}) cercando i gruppi di cui è membro l'utente \param{user}
(di nuovo specificato per nome e non per \ids{UID}) con cui costruisce una
-lista di gruppi supplementari, a cui aggiunge anche
-\param{group}, infine imposta questa lista per il processo corrente usando
-\func{setgroups}. Si tenga presente che sia \func{setgroups} che
-\func{initgroups} non sono definite nello standard POSIX.1 e che pertanto non
-è possibile utilizzarle quando si definisce \macro{\_POSIX\_SOURCE} o si
-compila con il flag \cmd{-ansi}, è pertanto meglio evitarle se si vuole
-scrivere codice portabile.
+lista di gruppi supplementari, a cui aggiunge anche \param{group}, infine
+imposta questa lista per il processo corrente usando \func{setgroups}. Si
+tenga presente che sia \func{setgroups} che \func{initgroups} non sono
+definite nello standard POSIX.1 e che pertanto non è possibile utilizzarle
+quando si definisce \macro{\_POSIX\_SOURCE} o si compila con il flag
+\cmd{-ansi}, è pertanto meglio evitarle se si vuole scrivere codice portabile.
\section{La gestione della priorità dei processi}
\end{errlist}}
\end{funcproto}
+\constbeg{PRIO\_MIN}
+\constbeg{PRIO\_MAX}
+
L'argomento \param{inc} indica l'incremento da effettuare rispetto al valore
di \textit{nice} corrente, che può assumere valori compresi fra
\const{PRIO\_MIN} e \const{PRIO\_MAX}; nel caso di Linux sono fra $-20$ e
utenti normali alzare (entro certi limiti, che vedremo in
sez.~\ref{sec:sys_resource_limit}) la priorità dei propri processi.
+\constend{PRIO\_MIN}
+\constend{PRIO\_MAX}
+
Gli standard SUSv2 e POSIX.1 prevedono che la funzione ritorni il nuovo valore
di \textit{nice} del processo; tuttavia la \textit{system call} di Linux non
segue questa convenzione e restituisce sempre $0$ in caso di successo e $-1$
\param{which} & \param{who} & \textbf{Significato} \\
\hline
\hline
- \const{PRIO\_PROCESS} & \type{pid\_t} & processo \\
- \const{PRIO\_PRGR} & \type{pid\_t} & \textit{process group} (vedi
- sez.~\ref{sec:sess_proc_group})\\
- \const{PRIO\_USER} & \type{uid\_t} & utente \\
+ \constd{PRIO\_PROCESS} & \type{pid\_t} & processo \\
+ \constd{PRIO\_PRGR} & \type{pid\_t} & \textit{process group} (vedi
+ sez.~\ref{sec:sess_proc_group})\\
+ \constd{PRIO\_USER} & \type{uid\_t} & utente \\
\hline
\end{tabular}
\caption{Legenda del valore dell'argomento \param{which} e del tipo
\textbf{Politica} & \textbf{Significato} \\
\hline
\hline
- \const{SCHED\_FIFO} & \textit{Scheduling real-time} con politica
- \textit{FIFO}. \\
- \const{SCHED\_RR} & \textit{Scheduling real-time} con politica
- \textit{Round Robin}. \\
+ \constd{SCHED\_FIFO} & \textit{Scheduling real-time} con politica
+ \textit{FIFO}. \\
+ \constd{SCHED\_RR} & \textit{Scheduling real-time} con politica
+ \textit{Round Robin}. \\
\hline
- \const{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\
- \const{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione
- ulteriore di lavoro \textit{CPU
- intensive} (dal kernel 2.6.16).\\
- \const{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente
- bassa (dal kernel 2.6.23).\\
+ \constd{SCHED\_OTHER}& \textit{Scheduling} ordinario.\\
+ \constd{SCHED\_BATCH}& \textit{Scheduling} ordinario con l'assunzione
+ ulteriore di lavoro \textit{CPU
+ intensive} (dal kernel 2.6.16).\\
+ \constd{SCHED\_IDLE} & \textit{Scheduling} di priorità estremamente
+ bassa (dal kernel 2.6.23).\\
\hline
\end{tabular}
\caption{Valori dell'argomento \param{policy} per la funzione
politica ordinaria essa ha senso soltanto per quelli \textit{real-time}, dato
che per i primi la priorità statica può essere soltanto nulla. La
disponibilità di entrambe le funzioni può essere verificata controllando la
-macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è definita nell'\textit{header
- file} \headfile{sched.h}.
+macro \macrod{\_POSIX\_PRIORITY\_SCHEDULING} che è definita
+nell'\textit{header file} \headfile{sched.h}.
Se invece si vuole sapere quale è politica di \textit{scheduling} di un
processo si può usare la funzione di sistema \funcd{sched\_getscheduler}, il
\vspace{3pt}
\begin{funcbox}{
\fhead{sched.h}
-\fdecl{void \macro{CPU\_ZERO}(cpu\_set\_t *set)}
+\fdecl{void \macrod{CPU\_ZERO}(cpu\_set\_t *set)}
\fdesc{Inizializza un insieme di processori vuoto \param{set}.}
-\fdecl{void \macro{CPU\_SET}(int cpu, cpu\_set\_t *set)}
+\fdecl{void \macrod{CPU\_SET}(int cpu, cpu\_set\_t *set)}
\fdesc{Inserisce il processore \param{cpu} nell'insieme di processori \param{set}.}
-\fdecl{void \macro{CPU\_CLR}(int cpu, cpu\_set\_t *set)}
+\fdecl{void \macrod{CPU\_CLR}(int cpu, cpu\_set\_t *set)}
\fdesc{Rimuove il processore \param{cpu} nell'insieme di processori \param{set}.}
-\fdecl{int \macro{CPU\_ISSET}(int cpu, cpu\_set\_t *set)}
+\fdecl{int \macrod{CPU\_ISSET}(int cpu, cpu\_set\_t *set)}
\fdesc{Controlla se il processore \param{cpu} è nell'insieme di processori \param{set}.}
}
\end{funcbox}}
Le CPU sono numerate da zero (che indica la prima disponibile) fino ad
un numero massimo che dipende dalla architettura hardware. La costante
-\const{CPU\_SETSIZE} indica il numero massimo di processori che possono far
+\constd{CPU\_SETSIZE} indica il numero massimo di processori che possono far
parte di un insieme (al momento vale sempre 1024), e costituisce un limite
massimo al valore dell'argomento \param{cpu}.
Dalla versione 2.6 della \acr{glibc} alle precedenti macro è stata aggiunta,
\vspace{3pt}
\begin{funcbox}{
\fhead{sched.h}
-\fdecl{int \macro{CPU\_COUNT}(cpu\_set\_t *set)}
+\fdecl{int \macrod{CPU\_COUNT}(cpu\_set\_t *set)}
\fdesc{Conta il numero di processori presenti nell'insieme \param{set}.}
}
\end{funcbox}}
\vspace{3pt}
\begin{funcbox}{
\fhead{sched.h}
-\fdecl{void \macro{CPU\_AND}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
+\fdecl{void \macrod{CPU\_AND}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
\fdesc{Esegue l'AND logico di due insiemi di processori.}
-\fdecl{void \macro{CPU\_OR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
+\fdecl{void \macrod{CPU\_OR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
\fdesc{Esegue l'OR logico di due insiemi di processori.}
-\fdecl{void \macro{CPU\_XOR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
+\fdecl{void \macrod{CPU\_XOR}(cpu\_set\_t *destset, cpu\_set\_t *srcset1, cpu\_set\_t *srcset2)}
\fdesc{Esegue lo XOR logico di due insiemi di processori.}
-\fdecl{int \macro{CPU\_EQUAL}(cpu\_set\_t *set1, cpu\_set\_t *set2)}
+\fdecl{int \macrod{CPU\_EQUAL}(cpu\_set\_t *set1, cpu\_set\_t *set2)}
\fdesc{Verifica se due insiemi di processori sono uguali.}
}
\end{funcbox}}
\vspace{3pt}
\begin{funcbox}{
\fhead{sched.h}
-\fdecl{cpu\_set\_t * \macro{CPU\_ALLOC}(num\_cpus)}
+\fdecl{cpu\_set\_t * \macrod{CPU\_ALLOC}(num\_cpus)}
\fdesc{Alloca dinamicamente un insieme di processori di dimensione voluta.}
-\fdecl{void \macro{CPU\_FREE}(cpu\_set\_t *set)}
+\fdecl{void \macrod{CPU\_FREE}(cpu\_set\_t *set)}
\fdesc{Disalloca un insieme di processori allocato dinamicamente.}
-\fdecl{size\_t \macro{CPU\_ALLOC\_SIZE}(num\_cpus)}
+\fdecl{size\_t \macrod{CPU\_ALLOC\_SIZE}(num\_cpus)}
\fdesc{Ritorna la dimensione di un insieme di processori allocato dinamicamente.}
}
\end{funcbox}}
\param{which} & \param{who} & \textbf{Significato} \\
\hline
\hline
- \const{IPRIO\_WHO\_PROCESS} & \type{pid\_t} & processo\\
- \const{IPRIO\_WHO\_PRGR} & \type{pid\_t} & \textit{process group}\\
- \const{IPRIO\_WHO\_USER} & \type{uid\_t} & utente\\
+ \constd{IPRIO\_WHO\_PROCESS} & \type{pid\_t} & processo\\
+ \constd{IPRIO\_WHO\_PRGR} & \type{pid\_t} & \textit{process group}\\
+ \constd{IPRIO\_WHO\_USER} & \type{uid\_t} & utente\\
\hline
\end{tabular}
\caption{Legenda del valore dell'argomento \param{which} e del tipo
classe stessa. Questo stesso formato viene utilizzato per indicare il valore
della priorità da impostare con l'argomento \param{ioprio} di
\func{ioprio\_set}.
+
\begin{table}[htb]
\centering
\footnotesize
\textbf{Macro} & \textbf{Significato}\\
\hline
\hline
- \macro{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})}
+ \macrod{IOPRIO\_PRIO\_CLASS}\texttt{(\textit{value})}
& Dato il valore di una priorità come
restituito da \func{ioprio\_get} estrae il
valore della classe.\\
- \macro{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})}
+ \macrod{IOPRIO\_PRIO\_DATA}\texttt{(\textit{value})}
& Dato il valore di una priorità come
restituito da \func{ioprio\_get} estrae il
valore della priorità.\\
- \macro{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})}
+ \macrod{IOPRIO\_PRIO\_VALUE}\texttt{(\textit{class},\textit{prio})}
& Dato un valore di priorità ed una classe
ottiene il valore numerico da passare a
\func{ioprio\_set}.\\
\textbf{Classe} & \textbf{Significato} \\
\hline
\hline
- \const{IOPRIO\_CLASS\_RT} & \textit{Scheduling} di I/O \textit{real-time}.\\
+ \const{IOPRIO\_CLASS\_RT} & \textit{Scheduling} di I/O
+ \textit{real-time}.\\
\const{IOPRIO\_CLASS\_BE} & \textit{Scheduling} di I/O ordinario.\\
- \const{IOPRIO\_CLASS\_IDLE}& \textit{Scheduling} di I/O di priorità minima.\\
+ \const{IOPRIO\_CLASS\_IDLE}& \textit{Scheduling} di I/O di priorità
+ minima.\\
\hline
\end{tabular}
\caption{Costanti che identificano le classi di \textit{scheduling} di I/O.}
processore. Ciascuna di esse è identificata tramite una opportuna costante,
secondo quanto riportato in tab.~\ref{tab:IOsched_class}.
-La classe di priorità più bassa è \const{IOPRIO\_CLASS\_IDLE}; i processi in
+La classe di priorità più bassa è \constd{IOPRIO\_CLASS\_IDLE}; i processi in
questa classe riescono ad accedere a disco soltanto quando nessun altro
processo richiede l'accesso. Occorre pertanto usarla con molta attenzione,
perché un processo in questa classe può venire completamente bloccato quando
valore di priorità, dato che in questo caso non esiste nessuna gerarchia e la
priorità è identica, la minima possibile, per tutti i processi.
-La seconda classe di priorità di I/O è \const{IOPRIO\_CLASS\_BE} (il nome sta
+La seconda classe di priorità di I/O è \constd{IOPRIO\_CLASS\_BE} (il nome sta
per \textit{best-effort}) che è quella usata ordinariamente da tutti
processi. In questo caso esistono priorità diverse che consentono di
assegnazione di una maggiore banda passante nell'accesso a disco ad un
Infine la classe di priorità di I/O \textit{real-time}
-\const{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un
+\constd{IOPRIO\_CLASS\_RT} ricalca le omonime priorità di processore: un
processo in questa classe ha sempre la precedenza nell'accesso a disco
rispetto a tutti i processi delle altre classi e di un processo nella stessa
classe ma con priorità inferiore, ed è pertanto in grado di bloccare
momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.}
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
+\item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
\textit{capability} (vedi sez.~\ref{sec:proc_capabilities}). La funzione
ritorna 1 se la capacità specificata nell'argomento \param{arg2} (con una
delle costanti di tab.~\ref{tab:proc_capabilities}) è presente nel
se \param{arg2} non è un valore valido si avrà un errore di \errval{EINVAL}.
Introdotta a partire dal kernel 2.6.25.
-\item[\const{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
+\item[\constd{PR\_CAPBSET\_DROP}] Rimuove permanentemente una delle
\textit{capabilities} (vedi sez.~\ref{sec:proc_capabilities}) dal processo e
da tutti i suoi discendenti. La funzione cancella la capacità specificata
nell'argomento \param{arg2} con una delle costanti di
chiamata fallirà con un errore di \errval{EINVAL}. Introdotta a partire dal
kernel 2.6.25.
-\item[\const{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
+\item[\constd{PR\_SET\_DUMPABLE}] Imposta il flag che determina se la
terminazione di un processo a causa di un segnale per il quale è prevista la
generazione di un file di \textit{core dump} (vedi
sez.~\ref{sec:sig_standard}) lo genera effettivamente. In genere questo flag
\textit{core dump} appartenente all'amministratore in directory dove
l'utente avrebbe avuto permessi di accesso.
-\item[\const{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_DUMPABLE}] Ottiene come valore di ritorno della funzione
lo stato corrente del flag che controlla la effettiva generazione dei
\textit{core dump}. Introdotta a partire dal kernel 2.3.20.
-\item[\const{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo
+\item[\constd{PR\_SET\_ENDIAN}] Imposta la \textit{endianness} del processo
chiamante secondo il valore fornito in \param{arg2}. I valori possibili sono
- sono: \const{PR\_ENDIAN\_BIG} (\textit{big endian}),
- \const{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
- \const{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
+ sono: \constd{PR\_ENDIAN\_BIG} (\textit{big endian}),
+ \constd{PR\_ENDIAN\_LITTLE} (\textit{little endian}), e
+ \constd{PR\_ENDIAN\_PPC\_LITTLE} (lo pseudo \textit{little endian} del
PowerPC). Introdotta a partire dal kernel 2.6.18, solo per architettura
PowerPC.
-\item[\const{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del
+\item[\constd{PR\_GET\_ENDIAN}] Ottiene il valore della \textit{endianness} del
processo chiamante, salvato sulla variabile puntata da \param{arg2} che deve
essere passata come di tipo ``\ctyp{int *}''. Introdotta a partire dal
kernel 2.6.18, solo su PowerPC.
-\item[\const{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione
+\item[\constd{PR\_SET\_FPEMU}] Imposta i bit di controllo per l'emulazione
della virgola mobile su architettura ia64, secondo il valore
- di \param{arg2}, si deve passare \const{PR\_FPEMU\_NOPRINT} per emulare in
+ di \param{arg2}, si deve passare \constd{PR\_FPEMU\_NOPRINT} per emulare in
maniera trasparente l'accesso alle operazioni in virgola mobile, o
- \const{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
+ \constd{PR\_FPEMU\_SIGFPE} per non emularle ed inviare il segnale
\signal{SIGFPE} (vedi sez.~\ref{sec:sig_prog_error}). Introdotta a partire
dal kernel 2.4.18, solo su architettura ia64.
-\item[\const{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
+\item[\constd{PR\_GET\_FPEMU}] Ottiene il valore dei flag di controllo
dell'emulazione della virgola mobile, salvato all'indirizzo puntato
da \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
partire dal kernel 2.4.18, solo su architettura ia64.
-\item[\const{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
+\item[\constd{PR\_SET\_FPEXC}] Imposta la modalità delle eccezioni in virgola
mobile (\textit{floating-point exception mode}) al valore di \param{arg2}.
I valori possibili sono:
\begin{itemize*}
- \item \const{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni,
- \item \const{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile,
- \item \const{PR\_FP\_EXC\_OVF} per gli overflow,
- \item \const{PR\_FP\_EXC\_UND} per gli underflow,
- \item \const{PR\_FP\_EXC\_RES} per risultati non esatti,
- \item \const{PR\_FP\_EXC\_INV} per operazioni invalide,
- \item \const{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
- \item \const{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione
+ \item \constd{PR\_FP\_EXC\_SW\_ENABLE} per usare FPEXC per le eccezioni,
+ \item \constd{PR\_FP\_EXC\_DIV} per la divisione per zero in virgola mobile,
+ \item \constd{PR\_FP\_EXC\_OVF} per gli overflow,
+ \item \constd{PR\_FP\_EXC\_UND} per gli underflow,
+ \item \constd{PR\_FP\_EXC\_RES} per risultati non esatti,
+ \item \constd{PR\_FP\_EXC\_INV} per operazioni invalide,
+ \item \constd{PR\_FP\_EXC\_DISABLED} per disabilitare le eccezioni,
+ \item \constd{PR\_FP\_EXC\_NONRECOV} per usare la modalità di eccezione
asincrona non recuperabile,
- \item \const{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione
+ \item \constd{PR\_FP\_EXC\_ASYNC} per usare la modalità di eccezione
asincrona recuperabile,
- \item \const{PR\_FP\_EXC\_PRECISE} per la modalità precisa di
+ \item \constd{PR\_FP\_EXC\_PRECISE} per la modalità precisa di
eccezione.\footnote{trattasi di gestione specialistica della gestione
delle eccezioni dei calcoli in virgola mobile che, i cui dettagli al
momento vanno al di là dello scopo di questo testo.}
\end{itemize*}
Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
-\item[\const{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
+\item[\constd{PR\_GET\_FPEXC}] Ottiene il valore della modalità delle eccezioni
delle operazioni in virgola mobile, salvata all'indirizzo
puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta
a partire dal kernel 2.4.21, solo su PowerPC.
-\item[\const{PR\_SET\_KEEPCAPS}] Consente di controllare quali
+\item[\constd{PR\_SET\_KEEPCAPS}] Consente di controllare quali
\textit{capabilities} vengono cancellate quando si esegue un cambiamento di
\ids{UID} del processo (per i dettagli si veda
sez.~\ref{sec:proc_capabilities}, in particolare quanto illustrato a
sez.~\ref{sec:proc_capabilities} e l'uso di \const{PR\_SET\_SECUREBITS} più
avanti). Introdotta a partire dal kernel 2.2.18.
-\item[\const{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_KEEPCAPS}] Ottiene come valore di ritorno della funzione
il valore del flag di controllo delle \textit{capabilities} impostato con
\const{PR\_SET\_KEEPCAPS}. Introdotta a partire dal kernel 2.2.18.
-\item[\const{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
+\item[\constd{PR\_SET\_NAME}] Imposta il nome del processo chiamante alla
stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}''. Il
nome può essere lungo al massimo 16 caratteri, e la stringa deve essere
terminata da NUL se più corta. Introdotta a partire dal kernel 2.6.9.
-\item[\const{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
+\item[\constd{PR\_GET\_NAME}] Ottiene il nome del processo chiamante nella
stringa puntata da \param{arg2}, che deve essere di tipo ``\ctyp{char *}'';
si devono allocare per questo almeno 16 byte, e il nome sarà terminato da
NUL se più corto. Introdotta a partire dal kernel 2.6.9.
-\item[\const{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
+\item[\constd{PR\_SET\_PDEATHSIG}] Consente di richiedere l'emissione di un
segnale, che sarà ricevuto dal processo chiamante, in occorrenza della
terminazione del proprio processo padre; in sostanza consente di invertire
il ruolo di \signal{SIGCHLD}. Il valore di \param{arg2} deve indicare il
automaticamente cancellato per un processo figlio creato con \func{fork}.
Introdotta a partire dal kernel 2.1.57.
-\item[\const{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
+\item[\constd{PR\_GET\_PDEATHSIG}] Ottiene il valore dell'eventuale segnale
emesso alla terminazione del padre, salvato all'indirizzo
puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
partire dal kernel 2.3.15.
\itindbeg{secure~computing~mode}
-\item[\const{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
+\item[\constd{PR\_SET\_SECCOMP}] Imposta il cosiddetto \textit{secure computing
mode} per il processo corrente. Prevede come unica possibilità
che \param{arg2} sia impostato ad 1. Una volta abilitato il \textit{secure
computing mode} il processo potrà utilizzare soltanto un insieme
% TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
% vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
-\item[\const{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_SECCOMP}] Ottiene come valore di ritorno della funzione
lo stato corrente del \textit{secure computing mode}, al momento attuale la
funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato
che la chiamata di questa funzione in \textit{secure computing mode}
eventuali estensioni future. Introdotta a partire dal kernel 2.6.23.
\itindend{secure~computing~mode}
-\item[\const{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
+\item[\constd{PR\_SET\_SECUREBITS}] Imposta i \textit{securebits} per il
processo chiamante al valore indicato da \param{arg2}; per i dettagli sul
significato dei \textit{securebits} si veda
sez.~\ref{sec:proc_capabilities}, ed in particolare i valori di
altrimenti la chiamata fallirà con un errore di \errval{EPERM}. Introdotta a
partire dal kernel 2.6.26.
-\item[\const{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
+\item[\constd{PR\_GET\_SECUREBITS}] Ottiene come valore di ritorno della
funzione l'impostazione corrente per i \textit{securebits}. Introdotta a
partire dal kernel 2.6.26.
-\item[\const{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
+\item[\constd{PR\_SET\_TIMING}] Imposta il metodo di temporizzazione del
processo da indicare con il valore di \param{arg2}, attualmente i valori
- possibili sono due, con \const{PR\_TIMING\_STATISTICAL} si usa il metodo
- statistico tradizionale, con \const{PR\_TIMING\_TIMESTAMP} il più accurato
+ possibili sono due, con \constd{PR\_TIMING\_STATISTICAL} si usa il metodo
+ statistico tradizionale, con \constd{PR\_TIMING\_TIMESTAMP} il più accurato
basato su dei \textit{timestamp}, quest'ultimo però non è ancora
implementato ed il suo uso comporta la restituzione di un errore di
\errval{EINVAL}. Introdotta a partire dal kernel 2.6.0-test4.
-\item[\const{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
+\item[\constd{PR\_GET\_TIMING}] Ottiene come valore di ritorno della funzione
il metodo di temporizzazione del processo attualmente in uso (uno dei due
valori citati per \const{PR\_SET\_TIMING}). Introdotta a partire dal kernel
2.6.0-test4.
-\item[\const{PR\_SET\_TSC}] Imposta il flag che indica se il processo
+\item[\constd{PR\_SET\_TSC}] Imposta il flag che indica se il processo
chiamante può leggere il registro di processore contenente il contatore dei
\textit{timestamp} (TSC, o \textit{Time Stamp Counter}) da indicare con il
- valore di \param{arg2}. Si deve specificare \const{PR\_TSC\_ENABLE} per
- abilitare la lettura o \const{PR\_TSC\_SIGSEGV} per disabilitarla con la
+ valore di \param{arg2}. Si deve specificare \constd{PR\_TSC\_ENABLE} per
+ abilitare la lettura o \constd{PR\_TSC\_SIGSEGV} per disabilitarla con la
generazione di un segnale di \signal{SIGSEGV} (vedi
sez.~\ref{sec:sig_prog_error}). La lettura viene automaticamente
disabilitata se si attiva il \textit{secure computing mode} (vedi
\const{PR\_SET\_SECCOMP} più avanti). Introdotta a partire dal kernel
2.6.26, solo su x86.
-\item[\const{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
+\item[\constd{PR\_GET\_TSC}] Ottiene il valore del flag che controlla la
lettura del contattore dei \textit{timestamp}, salvato all'indirizzo
puntato \param{arg2}, che deve essere di tipo ``\ctyp{int *}''. Introdotta a
partire dal kernel 2.6.26, solo su x86.
% http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html,
% http://en.wikipedia.org/wiki/Time_Stamp_Counter
-\item[\const{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
+\item[\constd{PR\_SET\_UNALIGN}] Imposta la modalità di controllo per l'accesso
a indirizzi di memoria non allineati, che in varie architetture risultano
illegali, da indicare con il valore di \param{arg2}. Si deve specificare il
- valore \const{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
- ed il valore \const{PR\_UNALIGN\_SIGBUS} per generare un segnale di
+ valore \constd{PR\_UNALIGN\_NOPRINT} per ignorare gli accessi non allineati,
+ ed il valore \constd{PR\_UNALIGN\_SIGBUS} per generare un segnale di
\signal{SIGBUS} (vedi sez.~\ref{sec:sig_prog_error}) in caso di accesso non
allineato. Introdotta con diverse versioni su diverse architetture.
Il comportamento di default prevede che per tutti i processi si applichi la
politica generale di sistema definita nel file
\sysctlfile{vm/memory\_failure\_early\_kill}, ma specificando
- per \param{arg2} il valore \const{PR\_MCE\_KILL\_SET} è possibile impostare
+ per \param{arg2} il valore \constd{PR\_MCE\_KILL\_SET} è possibile impostare
con il contenuto di \param{arg3} una politica specifica del processo
chiamante. Si può tornare alla politica di default del sistema utilizzando
- invece per \param{arg2} il valore \const{PR\_MCE\_KILL\_CLEAR}. In tutti i
+ invece per \param{arg2} il valore \constd{PR\_MCE\_KILL\_CLEAR}. In tutti i
casi, per compatibilità con eventuali estensioni future, tutti i valori
degli argomenti non utilizzati devono essere esplicitamente posti a zero,
pena il fallimento della chiamata con un errore di \errval{EINVAL}.
\const{PR\_MCE\_KILL\_SET} i valori di \param{arg3} possono essere soltanto
due, che corrispondono anche al valore che si trova nell'impostazione
generale di sistema di \texttt{memory\_failure\_early\_kill}, con
- \const{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
+ \constd{PR\_MCE\_KILL\_EARLY} si richiede l'emissione immediata di
\signal{SIGBUS} non appena viene rilevato un errore, mentre con
- \const{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
+ \constd{PR\_MCE\_KILL\_LATE} il segnale verrà inviato solo quando il processo
tenterà un accesso alla memoria corrotta. Questi due valori corrispondono
rispettivamente ai valori 1 e 0 di
\texttt{memory\_failure\_early\_kill}.\footnote{in sostanza nel primo caso
secondo caso prima la pagina di memoria viene tolta dallo spazio degli
indirizzi di ciascun processo, mentre il segnale viene inviato solo quei
processi che tentano di accedervi.} Si può usare per \param{arg3} anche un
- terzo valore, \const{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
+ terzo valore, \constd{PR\_MCE\_KILL\_DEFAULT}, che corrisponde a impostare
per il processo la politica di default.\footnote{si presume la politica di
default corrente, in modo da non essere influenzati da un eventuale
successivo cambiamento della stessa.} Introdotta a partire dal kernel
2.6.32.
-\item[\const{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
+\item[\constd{PR\_MCE\_KILL\_GET}] Ottiene come valore di ritorno della
funzione la politica di gestione degli errori dovuti a corruzione della
memoria. Tutti gli argomenti non utilizzati (al momento tutti) devono essere
nulli pena la ricezione di un errore di \errval{EINVAL}. Introdotta a
partire dal kernel 2.6.32.
\itindbeg{child~reaper}
-\item[\const{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
+\item[\constd{PR\_SET\_CHILD\_SUBREAPER}] Se \param{arg2} è diverso da zero
imposta l'attributo di \textit{child reaper} per il processo, se nullo lo
cancella. Lo stato di \textit{child reaper} è una funzionalità, introdotta
con il kernel 3.4, che consente di far svolgere al processo che ha questo
con lo stato di \textit{child reaper} termina prima dei suoi discendenti,
svolgerà questo ruolo il più prossimo antenato ad avere lo stato di
\textit{child reaper},
-\item[\const{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
+\item[\constd{PR\_GET\_CHILD\_SUBREAPER}] Ottiene l'impostazione relativa allo
lo stato di \textit{child reaper} del processo chiamante, salvata come
\textit{value result} all'indirizzo puntato da \param{arg2} (da indicare
come di tipo \code{int *}). Il valore viene letto come valore logico, se
\begin{basedescript}{\desclabelwidth{1.5 cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
+\item[\constd{CLONE\_CHILD\_CLEARTID}] cancella il valore del \textit{thread
ID} posto all'indirizzo dato dall'argomento \param{ctid}, eseguendo un
riattivazione del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a
quell'indirizzo. Questo flag viene utilizzato dalla librerie di gestione dei
\textit{thread} ed è presente dal kernel 2.5.49.
-\item[\const{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
+\item[\constd{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread}
figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene
utilizzato dalla librerie di gestione dei \textit{thread} ed è presente dal
kernel 2.5.49.
-\item[\const{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
+\item[\constd{CLONE\_FILES}] se impostato il nuovo processo condividerà con il
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
ordinario di un sistema unix-like e che illustreremo in dettaglio in
sez.~\ref{sec:file_shared_access}.
-\item[\const{CLONE\_FS}] se questo flag viene impostato il nuovo processo
+\item[\constd{CLONE\_FS}] se questo flag viene impostato il nuovo processo
condividerà con il padre le informazioni relative all'albero dei file, ed in
particolare avrà la stessa radice (vedi sez.~\ref{sec:file_chroot}), la
stessa directory di lavoro (vedi sez.~\ref{sec:file_work_dir}) e la stessa
informazioni, che saranno così indipendenti per i due processi, come avviene
nel comportamento ordinario di un sistema unix-like.
-\item[\const{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
+\item[\constd{CLONE\_IO}] se questo flag viene impostato il nuovo il nuovo
processo condividerà con il padre il contesto dell'I/O, altrimenti, come
come avviene nel comportamento ordinario con una \func{fork} otterrà un suo
contesto dell'I/O.
%TODO : tutti i CLONE_NEW* attengono ai namespace, ed è meglio metterli nella
%relativa sezione da creare a parte
-% \item[\const{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
+% \item[\constd{CLONE\_NEWIPC}] è uno dei flag ad uso dei \textit{container},
% introdotto con il kernel 2.6.19. L'uso di questo flag crea per il nuovo
% processo un nuovo \textit{namespace} per il sistema di IPC, sia per quello
% di SysV (vedi sez.~\ref{sec:ipc_sysv}) che, dal kernel 2.6.30, per le code
% la capacità \const{CAP\_SYS\_ADMIN}) e non può essere usato in combinazione
% con \const{CLONE\_SYSVSEM}.
-% \item[\const{CLONE\_NEWNET}]
-% \item[\const{CLONE\_NEWNS}]
-% \item[\const{CLONE\_NEWPID}]
-% \item[\const{CLONE\_NEWUTS}]
-
-\item[\const{CLONE\_PARENT}]
-\item[\const{CLONE\_PARENT\_SETTID}]
-\item[\const{CLONE\_PID}]
-\item[\const{CLONE\_PTRACE}]
-\item[\const{CLONE\_SETTLS}]
-\item[\const{CLONE\_SIGHAND}]
-\item[\const{CLONE\_STOPPED}]
-\item[\const{CLONE\_SYSVSEM}]
-\item[\const{CLONE\_THREAD}]
-\item[\const{CLONE\_UNTRACED}]
-\item[\const{CLONE\_VFORK}]
-\item[\const{CLONE\_VM}] se questo flag viene impostato il nuovo processo
+% \item[\constd{CLONE\_NEWNET}]
+% \item[\constd{CLONE\_NEWNS}]
+% \item[\constd{CLONE\_NEWPID}]
+% \item[\constd{CLONE\_NEWUTS}]
+
+\item[\constd{CLONE\_PARENT}]
+\item[\constd{CLONE\_PARENT\_SETTID}]
+\item[\constd{CLONE\_PID}]
+
+\item[\constd{CLONE\_PTRACE}] se questo flag viene impostato ed il processo
+ chiamante viene tracciato (vedi sez.~\ref{sec:process_ptrace}) anche il
+ figlio viene tracciato.
+
+\item[\constd{CLONE\_SETTLS}]
+\item[\constd{CLONE\_SIGHAND}]
+\item[\constd{CLONE\_STOPPED}]
+\item[\constd{CLONE\_SYSVSEM}]
+\item[\constd{CLONE\_THREAD}]
+
+\item[\constd{CLONE\_UNTRACED}] se questo flag viene impostato un processo non
+ può più forzare \const{CLONE\_PTRACE} su questo processo.
+
+\item[\constd{CLONE\_VFORK}] se questo flag viene impostato il chiamante viene
+ fermato fintato che il figlio appena creato non rilascia la sua memoria
+ virtuale con una chiamata a \func{exec} o \func{exit}, viene quindi
+ replicato il comportamento di \func{vfork}.
+
+\item[\constd{CLONE\_VM}] se questo flag viene impostato il nuovo processo
condividerà con il padre la stessa memoria virtuale, e le scritture in
memoria fatte da uno qualunque dei processi saranno visibili dall'altro,
così come ogni mappatura in memoria (vedi sez.~\ref{sec:file_memory_map}).
atomici. Non è affatto detto che lo stesso valga per interi di dimensioni
maggiori (in cui l'accesso può comportare più istruzioni in assembler) o per
le strutture di dati. In tutti questi casi è anche opportuno marcare come
-\direct{volatile} le variabili che possono essere interessate ad accesso
+\dirct{volatile} le variabili che possono essere interessate ad accesso
condiviso, onde evitare problemi con le ottimizzazioni del codice.
In genere le funzioni di libreria non sono rientranti, molte di esse ad
esempio utilizzano variabili statiche, la \acr{glibc} però mette a
-disposizione due macro di compilatore, \macro{\_REENTRANT} e
-\macro{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di
+disposizione due macro di compilatore, \macrod{\_REENTRANT} e
+\macrod{\_THREAD\_SAFE}, la cui definizione attiva le versioni rientranti di
varie funzioni di libreria, che sono identificate aggiungendo il suffisso
\code{\_r} al nome della versione normale.
% LocalWords: setreuid setregid FIXME ruid rgid seteuid setegid setresuid size
% LocalWords: setresgid getresuid getresgid value result argument setfsuid DAC
% LocalWords: setfsgid NGROUPS sysconf getgroups getgrouplist groups ngroups
-% LocalWords: setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary PF
+% LocalWords: setgroups initgroups patch LIDS CHOWN OVERRIDE Discrectionary
% LocalWords: SEARCH chattr sticky NOATIME socket domain immutable append mmap
% LocalWords: broadcast multicast multicasting memory locking mlock mlockall
% LocalWords: shmctl ioperm iopl chroot ptrace accounting swap reboot hangup
\signal{SIGILL} &PA& C & Istruzione illecita.\\
\signal{SIGTRAP} &S & C & Trappole per un Trace/breakpoint.\\
\signal{SIGABRT} &PA& C & Segnale di abort da \func{abort}.\\
- \signal{SIGIOT} &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\
+ \signald{SIGIOT} &B & C & Trappola di I/O. Sinonimo di \signal{SIGABRT}.\\
\signal{SIGBUS} &BS& C & Errore sul bus (bad memory access).\\
\signal{SIGFPE} &AP& C & Errore aritmetico.\\
\signal{SIGKILL} &P & T& Segnale di terminazione forzata.\\
\signal{SIGSYS} &VS& C & \textit{system call} sbagliata.\\
\hline
\signal{SIGSTKFLT}&?& T & Errore sullo stack del coprocessore (inusato).\\
- \signal{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di
+ \signald{SIGUNUSED}&?& C & Segnale inutilizzato (sinonimo di
\signal{SIGSYS}).\\
\hline
\signal{SIGCLD} &V & I & Sinonimo di \signal{SIGCHLD}.\\
può usare per ricostruire lo stato del programma al momento della
terminazione. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
+\item[\signald{SIGFPE}] Riporta un errore aritmetico fatale. Benché il nome
derivi da \textit{floating point exception} si applica a tutti gli errori
aritmetici compresa la divisione per zero e l'overflow. Se il gestore
ritorna il comportamento del processo è indefinito, ed ignorare questo
% aritmetiche e richiede che esse siano notificate.
% TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni
-\item[\signal{SIGILL}] Il nome deriva da \textit{illegal instruction},
+\item[\signald{SIGILL}] Il nome deriva da \textit{illegal instruction},
significa che il programma sta cercando di eseguire una istruzione
privilegiata o inesistente, in generale del codice illecito. Poiché il
compilatore del C genera del codice valido si ottiene questo segnale se il
problemi nell'esecuzione di un gestore. Se il gestore ritorna il
comportamento del processo è indefinito.
-\item[\signal{SIGSEGV}] Il nome deriva da \itindex{segment~violation}
- \textit{segment violation}, e significa che il programma sta cercando di
- leggere o scrivere in una zona di memoria protetta al di fuori di quella che
- gli è stata riservata dal sistema. In genere è il meccanismo della
- protezione della memoria che si accorge dell'errore ed il kernel genera il
- segnale. È tipico ottenere questo segnale dereferenziando un puntatore
- nullo o non inizializzato leggendo al di là della fine di un vettore. Se il
- gestore ritorna il comportamento del processo è indefinito.
+\item[\signald{SIGSEGV}] Il nome deriva da \textit{segment violation}, e
+ significa che il programma sta cercando di leggere o scrivere in una zona di
+ memoria protetta al di fuori di quella che gli è stata riservata dal
+ sistema. In genere è il meccanismo della protezione della memoria che si
+ accorge dell'errore ed il kernel genera il segnale. È tipico ottenere
+ questo segnale dereferenziando un puntatore nullo o non inizializzato
+ leggendo al di là della fine di un vettore. Se il gestore ritorna il
+ comportamento del processo è indefinito.
-\item[\signal{SIGBUS}] Il nome deriva da \textit{bus error}. Come
+\item[\signald{SIGBUS}] Il nome deriva da \textit{bus error}. Come
\signal{SIGSEGV} questo è un segnale che viene generato di solito quando si
dereferenzia un puntatore non inizializzato, la differenza è che
\signal{SIGSEGV} indica un accesso non permesso su un indirizzo esistente
\signal{SIGBUS} indica l'accesso ad un indirizzo non valido, come nel caso
di un puntatore non allineato.
-\item[\signal{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica
+\item[\signald{SIGABRT}] Il nome deriva da \textit{abort}. Il segnale indica
che il programma stesso ha rilevato un errore che viene riportato chiamando
la funzione \func{abort}, che genera questo segnale.
-\item[\signal{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
+\item[\signald{SIGTRAP}] È il segnale generato da un'istruzione di breakpoint o
dall'attivazione del tracciamento per il processo. È usato dai programmi per
il debugging e un programma normale non dovrebbe ricevere questo segnale.
-\item[\signal{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
+\item[\signald{SIGSYS}] Sta ad indicare che si è eseguita una istruzione che
richiede l'esecuzione di una \textit{system call}, ma si è fornito un codice
sbagliato per quest'ultima.
-\item[\signal{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non
+\item[\signald{SIGEMT}] Il nome sta per \textit{emulation trap}. Il segnale non
è previsto da nessuno standard ed è definito solo su alcune architetture che
come il vecchio PDP11 prevedono questo tipo di interruzione, non è presente
sui normali PC.
periferica). L'azione predefinita di questi segnali è di terminare il
processo, questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
+\item[\signald{SIGTERM}] Il nome sta per \textit{terminate}. È un segnale
generico usato per causare la conclusione di un programma. È quello che
viene generato di default dal comando \cmd{kill}. Al contrario di
\signal{SIGKILL} può essere intercettato, ignorato, bloccato. In genere lo
si usa per chiedere in maniera ``\textsl{educata}'' ad un processo di
concludersi.
-\item[\signal{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
+\item[\signald{SIGINT}] Il nome sta per \textit{interrupt}. È il segnale di
interruzione per il programma. È quello che viene generato di default dal
dall'invio sul terminale del carattere di controllo ``\textit{INTR}'',
\textit{interrupt} appunto, che viene generato normalmente dalla sequenza
\cmd{C-c} sulla tastiera.
-\item[\signal{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
+\item[\signald{SIGQUIT}] È analogo a \signal{SIGINT} con la differenza che è
controllato da un altro carattere di controllo, ``\textit{QUIT}'',
corrispondente alla sequenza \texttt{C-\bslash} sulla tastiera. A differenza
del precedente l'azione predefinita, oltre alla terminazione del processo,
(tipo la cancellazione di file temporanei), dato che in certi casi esse
possono eliminare informazioni utili nell'esame dei \textit{core dump}.
-\item[\signal{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
+\item[\signald{SIGKILL}] Il nome è utilizzato per terminare in maniera immediata
qualunque programma. Questo segnale non può essere né intercettato, né
ignorato, né bloccato, per cui causa comunque la terminazione del processo.
In genere esso viene generato solo per richiesta esplicita dell'utente dal
per condizioni particolari il processo non può più essere eseguito neanche
per eseguire un gestore.
-\item[\signal{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
+\item[\signald{SIGHUP}] Il nome sta per \textit{hang-up}. Segnala che il
terminale dell'utente si è disconnesso, ad esempio perché si è interrotta la
rete. Viene usato anche per riportare la terminazione del processo di
controllo di un terminale a tutti i processi della sessione (vedi
predefinita è irrilevante, in quanto il loro uso presuppone sempre la
necessità di un gestore. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
+\item[\signald{SIGALRM}] Il nome sta per \textit{alarm}. Segnale la scadenza di
un timer misurato sul tempo reale o sull'orologio di sistema. È normalmente
usato dalla funzione \func{alarm}.
-\item[\const{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
+\item[\signald{SIVGTALRM}] Il nome sta per \textit{virtual alarm}. È analogo al
precedente ma segnala la scadenza di un timer sul tempo di CPU usato dal
processo.
-\item[\signal{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
+\item[\signald{SIGPROF}] Il nome sta per \textit{profiling}. Indica la scadenza
di un timer che misura sia il tempo di CPU speso direttamente dal processo
che quello che il sistema ha speso per conto di quest'ultimo. In genere
viene usato dagli strumenti che servono a fare la profilazione dell'utilizzo
generare questi segnali. L'azione predefinita è di essere ignorati. Questi
segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGIO}] Questo segnale viene inviato quando un file descriptor è
+\item[\signald{SIGIO}] Questo segnale viene inviato quando un file descriptor è
pronto per eseguire dell'input/output. In molti sistemi solo i socket e i
terminali possono generare questo segnale, in Linux questo può essere usato
anche per i file, posto che la chiamata a \func{fcntl} che lo attiva abbia
avuto successo.
-\item[\signal{SIGURG}] Questo segnale è inviato quando arrivano dei dati
+\item[\signald{SIGURG}] Questo segnale è inviato quando arrivano dei dati
urgenti o \itindex{out-of-band} \textit{out-of-band} su di un
socket; per maggiori dettagli al proposito si veda
sez.~\ref{sec:TCP_urgent_data}.
-\item[\signal{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001,
+\item[\signald{SIGPOLL}] Questo segnale è definito nella standard POSIX.1-2001,
ed è equivalente a \signal{SIGIO} che invece deriva da BSD. Su Linux è
definito per compatibilità con i sistemi System V.
\end{basedescript}
loro uso è specializzato e viene trattato in maniera specifica nelle sezioni
in cui si trattano gli argomenti relativi. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
+\item[\signald{SIGCHLD}] Questo è il segnale mandato al processo padre quando un
figlio termina o viene fermato. L'azione predefinita è di ignorare il
segnale, la sua gestione è trattata in sez.~\ref{sec:proc_wait}.
-\item[\signal{SIGCLD}] Per Linux questo è solo un segnale identico al
+\item[\signald{SIGCLD}] Per Linux questo è solo un segnale identico al
precedente e definito come sinonimo. Il nome è obsoleto, deriva dalla
definizione del segnale su System V, ed oggi deve essere evitato.
-\item[\signal{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
+\item[\signald{SIGCONT}] Il nome sta per \textit{continue}. Il segnale viene
usato per fare ripartire un programma precedentemente fermato da
\signal{SIGSTOP}. Questo segnale ha un comportamento speciale, e fa sempre
ripartire il processo prima della sua consegna. Il comportamento predefinito
se viene fermato e riavviato, come per esempio riscrivere un prompt, o
inviare un avviso.
-\item[\signal{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta
+\item[\signald{SIGSTOP}] Il segnale ferma l'esecuzione di un processo, lo porta
cioè nello stato \textit{stopped} (vedi sez.~\ref{sec:proc_sched}). Il
segnale non può essere né intercettato, né ignorato, né bloccato.
-\item[\signal{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
+\item[\signald{SIGTSTP}] Il nome sta per \textit{interactive stop}. Il segnale
ferma il processo interattivamente, ed è generato dal carattere
``\textit{SUSP}'', prodotto dalla combinazione di tasti \cmd{C-z}, ed al
contrario di \signal{SIGSTOP} può essere intercettato e ignorato. In genere
esempio un programma ha disabilitato l'eco sul terminale può installare un
gestore per riabilitarlo prima di fermarsi.
-\item[\signal{SIGTTIN}] Un processo non può leggere dal terminale se esegue
+\item[\signald{SIGTTIN}] Un processo non può leggere dal terminale se esegue
una sessione di lavoro in \textit{background}. Quando un processo in
\textit{background} tenta di leggere da un terminale viene inviato questo
segnale a tutti i processi della sessione di lavoro. L'azione predefinita è
di fermare il processo. L'argomento è trattato in
sez.~\ref{sec:sess_job_control_overview}.
-\item[\signal{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
+\item[\signald{SIGTTOU}] Segnale analogo al precedente \signal{SIGTTIN}, ma
generato quando si tenta di scrivere sul terminale o modificarne uno dei
modi con un processo in \textit{background}. L'azione predefinita è di
fermare il processo, l'argomento è trattato in
resto del sistema. L'azione predefinita di questi segnali è normalmente
quella di terminare il processo, questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle
+\item[\signald{SIGPIPE}] Sta per \textit{Broken pipe}. Se si usano delle
\textit{pipe}, (o delle FIFO o dei socket) è necessario, prima che un
processo inizi a scrivere su una di esse, che un altro l'abbia aperta in
lettura (si veda sez.~\ref{sec:ipc_pipes}). Se il processo in lettura non è
ignorato la chiamata che lo ha causato fallisce, restituendo l'errore
\errcode{EPIPE}.
-\item[\signal{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
+\item[\signald{SIGXCPU}] Sta per \textit{CPU time limit exceeded}. Questo
segnale è generato quando un processo eccede il limite impostato per il
tempo di CPU disponibile, vedi sez.~\ref{sec:sys_resource_limit}. Fino al
kernel 2.2 terminava semplicemente il processo, a partire dal kernel 2.4,
seguendo le indicazioni dello standard POSIX.1-2001 viene anche generato un
\textit{core dump}.
-\item[\signal{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
+\item[\signald{SIGXFSZ}] Sta per \textit{File size limit exceeded}. Questo
segnale è generato quando un processo tenta di estendere un file oltre le
dimensioni specificate dal limite impostato per le dimensioni massime di un
file, vedi sez.~\ref{sec:sys_resource_limit}. Fino al kernel 2.2 terminava
semplicemente il processo, a partire dal kernel 2.4, seguendo le indicazioni
dello standard POSIX.1-2001 viene anche generato un \textit{core dump}.
-\item[\signal{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
+\item[\signald{SIGLOST}] Sta per \textit{Resource lost}. Tradizionalmente è il
segnale che viene generato quando si perde un advisory lock su un file su
NFS perché il server NFS è stato riavviato. Il progetto GNU lo utilizza per
indicare ad un client il crollo inaspettato di un server. In Linux è
Raccogliamo qui infine una serie di segnali che hanno scopi differenti non
classificabili in maniera omogenea. Questi segnali sono:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\signal{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
+\item[\signald{SIGUSR1}] Insieme a \signal{SIGUSR2} è un segnale a disposizione
dell'utente che lo può usare per quello che vuole. Viene generato solo
attraverso l'invocazione della funzione \func{kill}. Entrambi i segnali
possono essere utili per implementare una comunicazione elementare fra
processi diversi, o per eseguire a richiesta una operazione utilizzando un
gestore. L'azione predefinita è di terminare il processo.
-\item[\signal{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per
+\item[\signald{SIGUSR2}] È il secondo segnale a disposizione degli utenti. Per
il suo utilizzo vale esattamente quanto appena detto per \signal{SIGUSR1}.
-\item[\signal{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
+\item[\signald{SIGWINCH}] Il nome sta per \textit{window (size) change} e viene
generato in molti sistemi (GNU/Linux compreso) quando le dimensioni (in
righe e colonne) di un terminale vengono cambiate. Viene usato da alcuni
programmi testuali per riformattare l'uscita su schermo quando si cambia
dimensione a quest'ultimo. L'azione predefinita è di essere ignorato.
-\item[\signal{SIGINFO}] Il segnale indica una richiesta di informazioni. È
+\item[\signald{SIGINFO}] Il segnale indica una richiesta di informazioni. È
usato con il controllo di sessione, causa la stampa di informazioni da parte
del processo leader del gruppo associato al terminale di controllo, gli
altri processi lo ignorano. Su Linux però viene utilizzato come sinonimo di
\signal{SIGPWR} e l'azione predefinita è di terminare il processo.
-\item[\signal{SIGPWR}] Il segnale indica un cambio nello stato di
+\item[\signald{SIGPWR}] Il segnale indica un cambio nello stato di
alimentazione di un eventuale gruppo di continuità e viene usato
principalmente per segnalare l'assenza ed il ritorno della corrente. Viene
usato principalmente con \cmd{init} per attivare o fermare le procedure di
spegnimento automatico all'esaurimento delle batterie. L'azione predefinita
è di terminare il processo.
-\item[\signal{SIGSTKFLT}] Indica un errore nello stack del coprocessore
+\item[\signald{SIGSTKFLT}] Indica un errore nello stack del coprocessore
matematico, è definito solo per le architetture PC, ma è completamente
inusato. L'azione predefinita è di terminare il processo.
\end{basedescript}
più dettagliate dal sistema, attraverso la struttura \struct{siginfo\_t},
riportata in fig.~\ref{fig:sig_siginfo_t}. I due campi devono essere usati in
maniera alternativa, in certe implementazioni questi campi vengono addirittura
-definiti come una \direct{union}.
+definiti come una \direct{union}.\footnote{la direttiva \direct{union} del
+ linguaggio C definisce una variabile complessa, analoga a una stuttura, i
+ cui campi indicano i diversi tipi di valori che possono essere salvati, in
+ maniera alternativa, all'interno della stessa.}
Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile
accedere alle informazioni restituite attraverso il puntatore a questa
\begin{table}[!htb]
\footnotesize
\centering
- \begin{tabular}[c]{|l|p{8cm}|}
+ \begin{tabular}[c]{|l|p{10cm}|}
\hline
\textbf{Valore} & \textbf{Significato} \\
\hline
\const{TRAP\_BRKPT} & Breakpoint sul processo.\\
\const{TRAP\_TRACE} & Trappola di tracciamento del processo.\\
\hline
- \const{CLD\_EXITED} & Il figlio è uscito.\\
- \const{CLD\_KILLED} & Il figlio è stato terminato.\\
- \const{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\
- \const{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
- \const{CLD\_STOPPED} & Il figlio è stato fermato.\\
- \const{CLD\_CONTINUED}& Il figlio è ripartito.\\
+ \constd{CLD\_EXITED} & Il figlio è uscito.\\
+ \constd{CLD\_KILLED} & Il figlio è stato terminato.\\
+ \constd{CLD\_DUMPED} & Il figlio è terminato in modo anormale.\\
+ \constd{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
+ \constd{CLD\_STOPPED} & Il figlio è stato fermato.\\
+ \constd{CLD\_CONTINUED}& Il figlio è ripartito.\\
\hline
\const{POLL\_IN} & Disponibili dati in ingresso.\\
\const{POLL\_OUT} & Spazio disponibile sul buffer di uscita.\\
\end{table}
Il resto della struttura \struct{siginfo\_t} è definito come una
-\direct{union} ed i valori eventualmente presenti dipendono dal segnale
+\dirct{union} ed i valori eventualmente presenti dipendono dal segnale
ricevuto, così \signal{SIGCHLD} ed i segnali \textit{real-time} (vedi
sez.~\ref{sec:sig_real_time}) inviati tramite \func{kill} avvalorano
\var{si\_pid} e \var{si\_uid} coi valori corrispondenti al processo che ha
gestore di segnale.
Si noti come, essendo la funzione estremamente semplice, essa è definita come
-\direct{inline}. Questa direttiva viene usata per dire al compilatore di
+\dirct{inline}. Questa direttiva viene usata per dire al compilatore di
trattare la funzione cui essa fa riferimento in maniera speciale inserendo il
codice direttamente nel testo del programma. Anche se i compilatori più
moderni sono in grado di effettuare da soli queste manipolazioni (impostando
di un gestore di segnali la stessa funzione che dal segnale è stata
interrotta.
-\index{funzioni!sicure|(}
+\index{funzioni!\textit{signal safe}|(}
Il concetto è comunque più generale e porta ad una distinzione fra quelle che
POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e
\label{fig:sig_safe_functions}
\end{figure}
-\index{funzioni!sicure|)}
+\index{funzioni!\textit{signal safe}|)}
Lo standard POSIX.1-2004 modifica la lista di
fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e
sez.~\ref{sec:sig_sigaction}, è disponibile anche con i segnali ordinari, si
applicano solo ai nuovi segnali \textit{real-time}; questi ultimi sono
accessibili in un intervallo di valori specificati dalle due costanti
-\const{SIGRTMIN} e \const{SIGRTMAX}, che specificano il numero minimo e
+\constd{SIGRTMIN} e \constd{SIGRTMAX}, che specificano il numero minimo e
massimo associato ad un segnale \textit{real-time}.
Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1},
\end{figure}
Detto campo, identificato con il tipo di dato \type{sigval\_t}, è una
-\direct{union} di tipo \struct{sigval} (la sua definizione è in
+\dirct{union} di tipo \struct{sigval} (la sua definizione è in
fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico,
se usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma
\var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
segnale è stato installato con
\const{SA\_SIGINFO} gli verrà restituito il
valore specificato con \var{sigev\_value} (una
- \direct{union} \texttt{sigval}, la cui definizione
+ \dirct{union} \texttt{sigval}, la cui definizione
è 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
approfondimento sul significato delle opzioni generiche più importanti.
-\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|(}
+\constbeg{SO\_KEEPALIVE}
\subsubsection{L'opzione \const{SO\_KEEPALIVE}}
La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17})
che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso,
attivando il relativo comportamento.
-\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|)}
+\constend{SO\_KEEPALIVE}
-\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|(}
+\constbeg{SO\_REUSEADDR}
\subsubsection{L'opzione \const{SO\_REUSEADDR}}
La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
primo programma a consentirlo, avendo usato fin dall'inizio
\const{SO\_REUSEADDR}.}
-% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
-
+\constend{SO\_REUSEADDR}
-\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)}
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
-\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|(}
+\constbeg{SO\_LINGER}
\subsubsection{L'opzione \const{SO\_LINGER}}
La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
completamento della trasmissione dei dati sul buffer.} pari al valore
specificato in \var{l\_linger}.
-\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|)}
+\constend{SO\_LINGER}
dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0},
\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle
diversa caratteristiche e funzionalità nel secondo campo, che come si può
-notare è definito come una \direct{union} proprio in quanto il suo significato
+notare è definito come una \dirct{union} proprio in quanto il suo significato
varia a secondo dell'operazione scelta.
Si tenga inoltre presente che alcune di queste operazioni (in particolare
\var{ifc\_req}. Qualora il buffer sia stato allocato come una stringa, il suo
indirizzo potrà essere fornito usando il campo \var{ifc\_buf}.\footnote{si
noti che l'indirizzo del buffer è definito in \struct{ifconf} con una
- \direct{union}, questo consente di utilizzare una delle due forme a piacere.}
+ \dirct{union}, questo consente di utilizzare una delle due forme a piacere.}
La funzione restituisce nel buffer indicato una serie di strutture
\struct{ifreq} contenenti nel campo \var{ifr\_name} il nome dell'interfaccia e
Il membro \var{sin\_addr} contiene un indirizzo internet, e viene acceduto sia
come struttura (un resto di una implementazione precedente in cui questa era
-una \direct{union} usata per accedere alle diverse classi di indirizzi) che
+una \dirct{union} usata per accedere alle diverse classi di indirizzi) che
direttamente come intero. In \headfile{netinet/in.h} vengono definite anche
alcune costanti che identificano alcuni indirizzi speciali, riportati in
tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
(password, corrispondenze fra nomi simbolici e \ids{UID} numerici, home
directory, ecc.) venivano registrate all'interno dei due file di testo
-\conffile{/etc/passwd} ed \conffile{/etc/group}, il cui formato è descritto
+\conffiled{/etc/passwd} ed \conffiled{/etc/group}, il cui formato è descritto
dalle relative pagine del manuale\footnote{nella quinta sezione, quella dei
file di configurazione (esistono comandi corrispondenti), una trattazione
sistemistica dell'intero argomento coperto in questa sezione si consulti
In realtà oltre a questi due file da molto tempo gran parte dei sistemi
unix-like usano il cosiddetto sistema delle \textit{shadow password} che
-prevede anche i due file \conffile{/etc/shadow} e \conffile{/etc/gshadow}, in
+prevede anche i due file \conffiled{/etc/shadow} e \conffiled{/etc/gshadow}, in
cui sono state spostate le informazioni di autenticazione (ed inserite alcune
estensioni di gestione avanzata) per toglierle dagli altri file che devono
poter essere letti da qualunque processo per poter effettuare l'associazione
sottostanti.}
\end{funcproto}
-
Il comportamento di tutte queste funzioni è assolutamente identico alle
precedenti che leggono le informazioni sugli utenti, l'unica differenza è che
in questo caso le informazioni vengono restituite in una struttura di tipo
sistema viene mantenuto sempre in UTC e che la conversione all'ora locale del
proprio fuso orario viene effettuata dalle funzioni di libreria utilizzando le
opportune informazioni di localizzazione (specificate in
-\conffile{/etc/timezone}). In questo modo si ha l'assicurazione che l'orologio
+\conffiled{/etc/timezone}). In questo modo si ha l'assicurazione che l'orologio
di sistema misuri sempre un tempo monotono crescente come nella realtà, anche
in presenza di cambi di fusi orari.
definito in \headfile{time.h} è ormai considerato obsoleto e non deve essere
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
in realtà questa granularità viene calcolata in maniera indipendente usando la
costante del kernel \const{USER\_HZ}.
+\constend{HZ}
+
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
La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire
dal valore della variabile di ambiente \envvar{TZ}, se quest'ultima non è
-definita verrà usato il file \conffile{/etc/localtime}. La variabile
+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}
anche una macro, e questo è infatti il metodo usato da Linux per renderla
locale ai singoli \itindex{thread} \textit{thread}.
-La variabile è in genere definita come \direct{volatile} dato che può essere
+La variabile è in genere definita come \dirct{volatile} dato che può essere
cambiata in modo asincrono da un segnale, per un esempio si veda
sez.~\ref{sec:sig_sigchld} ricordando quanto trattato in
sez.~\ref{sec:proc_race_cond}). Dato che un gestore di segnale scritto bene si
costante come operando a destra in una assegnazione.
Per questo motivo nell'header \headfile{netinet/in.h} è definita una variabile
-\macro{in6addr\_any} (dichiarata come \direct{extern}, ed inizializzata dal
+\macro{in6addr\_any} (dichiarata come \dirct{extern}, ed inizializzata dal
sistema al valore \const{IN6ADRR\_ANY\_INIT}) che permette di effettuare una
assegnazione del tipo: \includecodesnip{listati/serv_addr_sin6_addr.c} in
maniera analoga si può utilizzare la variabile \macro{in6addr\_loopback} per