From 04a547df13e4c672d95e1060e1ada9ae2e1fcb2f Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Sun, 11 Oct 2015 21:52:34 +0000 Subject: [PATCH] =?utf8?q?Ancora=20reindicizzazioni,=20pi=C3=B9=20CLONE=5F?= =?utf8?q?VFORK,=20CLONE=5FVM,=20CLONE=5FPTRACED?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- fileadv.tex | 20 +- filedir.tex | 560 ++++++++++++++++++++++++++------------------------- fileio.tex | 96 +++++---- intro.tex | 63 +++--- ipc.tex | 11 +- macro.tex | 78 ++++++- process.tex | 140 +++++++------ prochand.tex | 367 +++++++++++++++++---------------- signal.tex | 123 +++++------ sockctrl.tex | 19 +- socket.tex | 2 +- system.tex | 14 +- tcpsock.tex | 2 +- 13 files changed, 805 insertions(+), 690 deletions(-) diff --git a/fileadv.tex b/fileadv.tex index 9c06b50..027cbaa 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1836,7 +1836,7 @@ modificano le modalità di notifica. 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 @@ -3336,15 +3336,15 @@ così all'applicazione di collegare la corrispondente coppia di eventi 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 diff --git a/filedir.tex b/filedir.tex index 42e71e5..4e7ead4 100644 --- a/filedir.tex +++ b/filedir.tex @@ -399,7 +399,7 @@ per i dati in essi contenuti. \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} @@ -414,7 +414,7 @@ esposto in fig.~\ref{fig:file_filesys_detail}. \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} @@ -739,9 +739,9 @@ In Linux \param{mountflags} deve essere un intero a 32 bit; fino ai kernel 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 @@ -751,7 +751,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: \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 @@ -810,7 +810,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: \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 @@ -824,13 +824,13 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -840,10 +840,9 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -855,7 +854,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -870,14 +869,14 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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. @@ -893,7 +892,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -908,7 +907,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -923,14 +922,14 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: \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} @@ -941,7 +940,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: % 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 @@ -962,7 +961,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -979,7 +978,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: \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 @@ -1000,13 +999,13 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: \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 @@ -1024,13 +1023,13 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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}). @@ -1042,7 +1041,7 @@ con un OR aritmetico dei valori dalle costanti riportate nell'elenco seguente: 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 @@ -1135,7 +1134,7 @@ un filesystem anche quando questo risulti occupato; il suo prototipo è: 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 @@ -1150,20 +1149,21 @@ eseguita una sincronizzazione dei dati. \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} @@ -1171,13 +1171,13 @@ eseguita una sincronizzazione dei dati. \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 @@ -1187,7 +1187,7 @@ verrà smontato. Questo flag consente di realizzare un meccanismo che smonti 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 @@ -1248,8 +1248,9 @@ del filesystem stesso. \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}, @@ -1275,6 +1276,7 @@ filesystem montati) generata direttamente dal kernel, e quindi sempre 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 ...) @@ -1607,7 +1609,7 @@ nella directory porterebbe il comando ad esaminare \file{/boot}, 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 @@ -2171,9 +2173,9 @@ terminata da uno zero, ed il campo \var{d\_ino}, che contiene il numero di 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 @@ -2192,7 +2194,7 @@ ottenere la dimensione della prima parte con la macro di utilità generica \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}.} } @@ -2226,14 +2228,14 @@ valore è disponibile solo per i filesystem che ne supportano la restituzione \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} @@ -2249,10 +2251,10 @@ definite anche due macro di conversione, \macro{IFTODT} e \macro{DTTOIF}: \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}.} } @@ -2498,9 +2500,9 @@ directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati 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 @@ -2747,8 +2749,8 @@ avere problemi di compatibilità con eventuali ulteriori estensioni. 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 @@ -2758,9 +2760,9 @@ rispettivamente con le macro \macro{major} e \macro{minor}: \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} @@ -2774,7 +2776,7 @@ macro \macro{makedev}: \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.} } @@ -2855,20 +2857,20 @@ la prima di queste funzioni create a questo scopo era 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} @@ -2881,11 +2883,11 @@ il file esplicitamente, il suo prototipo è: \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 @@ -3185,13 +3187,13 @@ tipo di file in maniera standardizzata. \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}).} @@ -3215,36 +3217,36 @@ come argomento il valore di \var{st\_mode}. \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 @@ -3777,8 +3779,8 @@ tempo di ultimo accesso ed il secondo quello di ultima modifica, e se si usa 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. @@ -3799,13 +3801,13 @@ partire dalla versione 2.6.\footnote{in precedenza, a partire dal kernel 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 @@ -3917,17 +3919,17 @@ in tab.~\ref{tab:file_bit_perm}. \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 @@ -4280,10 +4282,10 @@ controllati sono disponibili. \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 @@ -4354,24 +4356,24 @@ file. \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 @@ -4990,9 +4992,9 @@ Il valore che verrà assegnato all'attributo dovrà essere preparato nel buffer 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'è. @@ -5151,21 +5153,21 @@ la capacità \const{CAP\_FOWNER}. \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} @@ -5480,8 +5482,8 @@ tab.~\ref{tab:acl_type}. \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.} @@ -5640,21 +5642,21 @@ tab.~\ref{tab:acl_to_text_options}. \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 @@ -6021,7 +6023,7 @@ macro \macro{QCMD}: \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}.} } @@ -6042,7 +6044,7 @@ essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} o \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} @@ -6050,11 +6052,11 @@ essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} o 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 @@ -6062,33 +6064,33 @@ essere sempre definito ed assegnato ad uno fra i due valori \const{USRQUOTA} o 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 @@ -6164,27 +6166,25 @@ ciascuna di esse ed i campi a cui fanno riferimento. \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}.} @@ -6219,21 +6219,19 @@ identificate tramite le costanti di tab.~\ref{tab:quotactl_id_format}. \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 @@ -6267,12 +6265,12 @@ significato di ciascuna di esse ed i campi a cui fanno riferimento. \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}.} @@ -6689,7 +6687,7 @@ cancellato il flag \const{SECURE\_KEEP\_CAPS}. \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 @@ -6697,14 +6695,14 @@ cancellato il flag \const{SECURE\_KEEP\_CAPS}. 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 @@ -6722,10 +6720,10 @@ A ciascuno dei flag di tab.~\ref{tab:securebits_values} è inoltre abbinato un 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 @@ -6786,20 +6784,20 @@ opportuno dettagliare maggiormente. % % 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}).\\ @@ -6807,7 +6805,7 @@ opportuno dettagliare maggiormente. 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à @@ -6815,16 +6813,16 @@ opportuno dettagliare maggiormente. 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 @@ -6833,69 +6831,69 @@ opportuno dettagliare maggiormente. % 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).\\ @@ -6906,6 +6904,7 @@ opportuno dettagliare maggiormente. \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 è @@ -6930,6 +6929,9 @@ processo di eliminare una capacità dal proprio \textit{bounding set} (con la 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 @@ -6946,6 +6948,9 @@ sez.~\ref{sec:file_special_perm}), la possibilità di impostare il flag 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 @@ -6953,6 +6958,9 @@ il \textit{multicasting} (vedi sez.\ref{sec:sock_ipv4_options}), eseguire la 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 @@ -6972,6 +6980,9 @@ sez.~\ref{sec:keyctl_management}), usare la funzione \func{lookup\_dcookie}, 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 @@ -6983,6 +6994,9 @@ alla memoria, essa viene a coprire anche la possibilità di assegnare priorità 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, @@ -6992,6 +7006,8 @@ risorse di un processo (vedi sez.~\ref{sec:sys_resource_limit}) e quelle sul 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 @@ -7240,9 +7256,9 @@ tab.~\ref{tab:cap_set_identifier}. \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 @@ -7276,7 +7292,7 @@ questo si può infatti usare la apposita macro \macro{CAP\_DIFFERS}: \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}.} } @@ -7338,8 +7354,8 @@ tab.~\ref{tab:cap_value_type}. \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 @@ -7659,15 +7675,13 @@ directory di lavoro, ha anche una directory \textsl{radice}\footnote{entrambe \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 @@ -7700,12 +7714,11 @@ directory radice con la funzione di sistema \funcd{chroot}, il cui prototipo \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 @@ -7719,10 +7732,9 @@ Questo è il motivo per cui la funzione è efficace nel restringere un processo 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 diff --git a/fileio.tex b/fileio.tex index ba66a35..6abde2f 100644 --- a/fileio.tex +++ b/fileio.tex @@ -14,9 +14,9 @@ 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 @@ -468,16 +468,15 @@ Si è riportato in tab.~\ref{tab:open_time_flag} l'elenco dei flag delle 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 @@ -1561,14 +1560,14 @@ filesystem su cui il file ad esso corrispondente si trova. \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 @@ -1581,27 +1580,27 @@ Solaris, a fianco delle normali funzioni che operano sui file (come \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 @@ -1628,17 +1627,16 @@ esame la nuova funzione di sistema \funcd{openat}, avremo il prototipo: \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 @@ -1653,8 +1651,8 @@ errori si aggiungono però quelli dovuti a valori errati per \param{dirfd}; in 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 @@ -1736,8 +1734,8 @@ che \func{lchown}; il suo prototipo è: \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} @@ -1765,8 +1763,8 @@ prima di queste è \funcd{faccessat}, ed il suo prototipo è: \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} @@ -1798,8 +1796,8 @@ alla funzione di comportarsi sia come analogo di \func{unlink} che di \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} diff --git a/intro.tex b/intro.tex index f18cc3a..2157e74 100644 --- a/intro.tex +++ b/intro.tex @@ -555,16 +555,21 @@ alle directory indicate nel \textit{pathname} (torneremo su questo 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 @@ -573,12 +578,12 @@ corrente e il secondo alla directory \textsl{genitrice} (o \textit{parent 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} @@ -682,7 +687,7 @@ VMS.\footnote{questo vale anche per i dispositivi a blocchi: la strutturazione 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 @@ -1229,18 +1234,18 @@ Le macro disponibili per controllare l'aderenza ai vari standard messi a 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à: @@ -1266,7 +1271,7 @@ in essi definite, sono illustrate nel seguente elenco: \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 @@ -1292,14 +1297,14 @@ in essi definite, sono illustrate nel seguente elenco: \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 @@ -1310,7 +1315,7 @@ in essi definite, sono illustrate nel seguente elenco: 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 @@ -1332,14 +1337,14 @@ in essi definite, sono illustrate nel seguente elenco: 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}. @@ -1351,13 +1356,13 @@ in essi definite, sono illustrate nel seguente elenco: 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. @@ -1391,14 +1396,14 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: \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 @@ -1414,7 +1419,7 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: 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 @@ -1430,13 +1435,13 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: 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 @@ -1444,7 +1449,7 @@ una opportuna macro; queste estensioni sono illustrate nel seguente elenco: 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 diff --git a/ipc.tex b/ipc.tex index 7f7dc44..6f5f8cb 100644 --- a/ipc.tex +++ b/ipc.tex @@ -539,9 +539,8 @@ una \textit{fifo} in scrittura anche se non ci sono ancora processi il 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 @@ -2084,7 +2083,7 @@ specificata con \param{cmd}, ed opera o sull'intero insieme specificato da \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} @@ -4627,8 +4626,8 @@ dall'argomento \param{sem}, se questo era nullo la relativa risorsa risulterà 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 è: diff --git a/macro.tex b/macro.tex index 4b74b8c..1561d44 100644 --- a/macro.tex +++ b/macro.tex @@ -123,19 +123,36 @@ } \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}% @@ -147,24 +164,50 @@ \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 @@ -184,9 +227,22 @@ %\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}% @@ -204,11 +260,13 @@ \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]{% @@ -243,6 +301,12 @@ \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 diff --git a/process.tex b/process.tex index be725cd..b25c658 100644 --- a/process.tex +++ b/process.tex @@ -248,8 +248,7 @@ di quelli installati con il sistema,\footnote{in un sistema GNU/Linux che 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 è @@ -427,10 +426,10 @@ usare un multiplo di 256, di avere uno stato di uscita uguale a zero, che 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} @@ -482,7 +481,7 @@ chiamata ad una funzione che effettui tali operazioni all'uscita dal 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 è @@ -663,7 +662,7 @@ bit e di 8kb sulle alpha. Con le versioni più recenti del kernel è possibile 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}). @@ -754,10 +753,10 @@ processo. Essa viene divisa in \textsl{segmenti}, cioè un insieme contiguo di 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 @@ -783,7 +782,7 @@ programma C viene suddiviso nei seguenti segmenti: 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} @@ -810,7 +809,7 @@ programma C viene suddiviso nei seguenti segmenti: 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 @@ -834,7 +833,7 @@ programma C viene suddiviso nei seguenti segmenti: 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 @@ -878,7 +877,7 @@ mai salvato sul file che contiene l'eseguibile, dato che viene sempre inizializzato a zero al caricamento del programma. \index{segmento!testo|)} -\index{segmento!dati)} +\index{segmento!dati|)} \itindend{heap} \itindend{stack} @@ -1074,25 +1073,23 @@ Il problema è che l'esaurimento della memoria può avvenire in qualunque 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 @@ -1155,7 +1152,7 @@ Gli svantaggi sono che questa funzione non è disponibile su tutti gli Unix, e 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 @@ -1174,7 +1171,6 @@ comportamento del programma può risultare indefinito, dando luogo ad una \textit{segment violation} la prima volta che cercherà di accedere alla memoria non effettivamente disponibile. - \index{segmento!dati|(} \itindbeg{heap} @@ -1200,9 +1196,9 @@ uguale di 500). La prima funzione è \funcd{brk}, ed il suo prototipo è: 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 @@ -1370,7 +1366,7 @@ sez.~\ref{sec:proc_exec}). 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 @@ -1454,10 +1450,10 @@ espressi dalle costanti riportate in tab.~\ref{tab:mlockall_flags}. \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 @@ -1636,20 +1632,20 @@ tipologia di errore riscontrata. \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 @@ -1860,7 +1856,7 @@ Normalmente \func{getopt} compie una permutazione degli elementi di 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 @@ -2319,7 +2315,7 @@ relativo puntatore fra le funzioni. \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 @@ -2377,6 +2373,8 @@ quelli variabili vengono indicati in maniera generica dalla 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 @@ -2396,6 +2394,8 @@ deve essere una apposita variabile di tipo \type{va\_list}; il 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 è: @@ -2423,8 +2423,10 @@ effettivamente forniti si otterranno dei valori indefiniti. Si avranno 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}{ @@ -2467,6 +2469,10 @@ caso però al ritorno della funzione \macro{va\_arg} non può più essere usata (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 @@ -2489,7 +2495,7 @@ utilizzare solo attraverso dalle opportune funzioni di gestione. 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: @@ -2503,7 +2509,7 @@ 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 @@ -2535,7 +2541,7 @@ valore speciale per l'ultimo argomento, come fa ad esempio \func{execl} che 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} @@ -2625,10 +2631,10 @@ dell'argomento \param{val} deve essere sempre diverso da zero, se si è 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 @@ -2652,13 +2658,13 @@ dei seguenti casi: 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 diff --git a/prochand.tex b/prochand.tex index eb37253..b6bb0bb 100644 --- a/prochand.tex +++ b/prochand.tex @@ -206,7 +206,7 @@ tradizionalmente il \ids{PID} un numero positivo memorizzato in un intero a 16 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 @@ -999,12 +999,12 @@ sono riportate anche le costanti definite per indicare alcuni di essi. $<-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 @@ -1042,17 +1042,17 @@ sez.~\ref{sec:thread_xxx}). 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 @@ -1065,6 +1065,7 @@ sez.~\ref{sec:thread_xxx}). \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 @@ -1072,6 +1073,10 @@ condizioni per l'uscita della funzione. in tal caso. In tal caso la funzione, 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 @@ -1088,6 +1093,9 @@ mentre con \const{WCONTINUED} la funzione ritorna quando un processo in stato \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, @@ -1148,40 +1156,40 @@ ecc.\footnote{le definizioni esatte si possono trovare in \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).\\ @@ -1249,16 +1257,16 @@ primo, quale processo o quale gruppo di processi selezionare. \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 @@ -1286,15 +1294,15 @@ nuovo riceverne lo stato. \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} @@ -1402,7 +1410,7 @@ prototipo è: \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. @@ -1664,7 +1672,7 @@ del programma per caricare le librerie necessarie ed effettuare il link 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}. @@ -1685,7 +1693,7 @@ lunghezza massima di 127 caratteri e se questa dimensione viene ecceduta la 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/}. @@ -1851,7 +1859,7 @@ servano di nuovo. 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 è @@ -2165,7 +2173,7 @@ gruppi supplementari cui un utente può appartenere. Ogni processo può avere 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 @@ -2223,7 +2231,7 @@ dimensioni adeguate. 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 @@ -2272,13 +2280,12 @@ caso \var{errno} assumerà uno dei valori: 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} @@ -2502,6 +2509,9 @@ processo corrente, il suo prototipo è: \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 @@ -2519,6 +2529,9 @@ priorità di un processo, a partire da questa versione è consentito anche agli 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$ @@ -2582,10 +2595,10 @@ l'utente correnti. \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 @@ -2778,17 +2791,17 @@ corrente. \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 @@ -2948,8 +2961,8 @@ corrente. Benché la funzione sia utilizzabile anche con processi sottoposti a 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 @@ -3210,13 +3223,13 @@ se esso è già presente in un insieme, sono le seguenti: \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}} @@ -3246,7 +3259,7 @@ volte, l'argomento cioè non deve avere \textsl{effetti collaterali} (in gergo 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, @@ -3256,7 +3269,7 @@ per contare il numero di processori in un insieme, l'ulteriore: \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}} @@ -3269,13 +3282,13 @@ compiere delle operazioni logiche sugli insiemi di processori con: \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}} @@ -3304,11 +3317,11 @@ disallocare ed ottenere la dimensione in byte di un insieme di processori: \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}} @@ -3453,9 +3466,9 @@ sez.~\ref{sec:sess_proc_group}) o tutti i processi di un utente. \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 @@ -3472,6 +3485,7 @@ di \textit{scheduling} lo prevede, la priorità del processo all'interno della 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 @@ -3480,15 +3494,15 @@ della priorità da impostare con l'argomento \param{ioprio} di \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}.\\ @@ -3517,9 +3531,11 @@ argomento di \func{ioprio\_set} per eseguire una impostazione. \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.} @@ -3532,7 +3548,7 @@ a quelle già adottate anche nel funzionamento dello \textit{scheduler} del 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 @@ -3541,7 +3557,7 @@ accedendo al disco. Quando si usa questa classe non ha senso indicare un 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 @@ -3554,7 +3570,7 @@ priorità maggiore. 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 @@ -3630,7 +3646,7 @@ predefinite del seguente elenco, che illustra quelle disponibili al 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 @@ -3638,7 +3654,7 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} 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 @@ -3650,7 +3666,7 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} 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 @@ -3671,64 +3687,64 @@ momento:\footnote{alla stesura di questa sezione, cioè con il kernel 3.2.} \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 @@ -3740,21 +3756,21 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 @@ -3762,13 +3778,13 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 @@ -3794,7 +3810,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. % 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} @@ -3802,7 +3818,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 @@ -3811,35 +3827,35 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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. @@ -3847,11 +3863,11 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. % 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. @@ -3875,10 +3891,10 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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}. @@ -3887,9 +3903,9 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. \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 @@ -3898,18 +3914,18 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 @@ -3926,7 +3942,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. 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 @@ -4107,18 +4123,18 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa \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 @@ -4131,7 +4147,7 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa 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 @@ -4141,7 +4157,7 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa 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. @@ -4157,7 +4173,7 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa %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 @@ -4169,23 +4185,34 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa % 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}). @@ -4336,7 +4363,7 @@ assumere che, in ogni piattaforma su cui è implementato Linux, il tipo 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. @@ -4446,8 +4473,8 @@ parte del programmatore. 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. @@ -4477,7 +4504,7 @@ varie funzioni di libreria, che sono identificate aggiungendo il suffisso % 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 diff --git a/signal.tex b/signal.tex index bde6dfc..4463fb0 100644 --- a/signal.tex +++ b/signal.tex @@ -341,7 +341,7 @@ esse sono definite nell'header di sistema \headfile{signal.h}. \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.\\ @@ -373,7 +373,7 @@ esse sono definite nell'header di sistema \headfile{signal.h}. \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}.\\ @@ -498,7 +498,7 @@ la registrazione su disco di un file di \textit{core dump}, che un debugger 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 @@ -510,7 +510,7 @@ terminazione. Questi segnali sono: % 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 @@ -522,16 +522,16 @@ terminazione. Questi segnali sono: 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 @@ -539,19 +539,19 @@ terminazione. Questi segnali sono: \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. @@ -573,20 +573,20 @@ funzionamento (come il modo del terminale o le impostazioni di una qualche 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, @@ -597,7 +597,7 @@ processo, questi segnali sono: (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 @@ -612,7 +612,7 @@ processo, questi segnali sono: 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 @@ -634,15 +634,15 @@ causare la terminazione del programma, ma con questi segnali la scelta 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 @@ -658,18 +658,18 @@ questo occorre comunque usare \func{fcntl} per abilitare un file descriptor a 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} @@ -682,15 +682,15 @@ Questi sono i segnali usati dal controllo delle sessioni e dei processi, il 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 @@ -705,11 +705,11 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: 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 @@ -718,14 +718,14 @@ in cui si trattano gli argomenti relativi. Questi segnali sono: 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 @@ -742,7 +742,7 @@ che impediscono il completamento dell'esecuzione dovute all'interazione con il 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 è @@ -751,21 +751,21 @@ quella di terminare il processo, questi segnali sono: 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 è @@ -779,31 +779,31 @@ quella di terminare il processo, questi segnali sono: 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} @@ -2148,7 +2148,10 @@ permette di usare un gestore più complesso, in grado di ricevere informazioni 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 @@ -2188,7 +2191,7 @@ altre informazioni specifiche. \begin{table}[!htb] \footnotesize \centering - \begin{tabular}[c]{|l|p{8cm}|} + \begin{tabular}[c]{|l|p{10cm}|} \hline \textbf{Valore} & \textbf{Significato} \\ \hline @@ -2266,12 +2269,12 @@ riferimento. \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.\\ @@ -2289,7 +2292,7 @@ riferimento. \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 @@ -2344,7 +2347,7 @@ semplificare la definizione si è poi definito un apposito tipo 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 @@ -2547,7 +2550,7 @@ principale, cosa che ad esempio può rendere problematico chiamare all'interno 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 @@ -2610,7 +2613,7 @@ fig.~\ref{fig:sig_safe_functions}. \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 @@ -2698,7 +2701,7 @@ Tutte queste nuove funzionalità eccetto l'ultima, che, come illustrato in 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}, @@ -2760,7 +2763,7 @@ mentre per la restituzione dei dati viene usato il campo \var{si\_value}. \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 @@ -3340,7 +3343,7 @@ effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione 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 diff --git a/sockctrl.tex b/sockctrl.tex index d94093e..dbe5ae3 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2358,7 +2358,7 @@ programmazione dei socket. Per questo motivo faremo in questa sezione un 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 @@ -2460,11 +2460,11 @@ tutte le volte che un processo figlio viene eseguito in risposta ad una 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 @@ -2637,12 +2637,11 @@ stesso indirizzo e porta solo se il programma che ha eseguito per primo 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 @@ -2728,7 +2727,7 @@ secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata da 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} @@ -3642,7 +3641,7 @@ il primo campo della struttura, \var{ifr\_name} per specificare il nome 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 @@ -3844,7 +3843,7 @@ questo buffer deve essere specificata nel campo \var{ifc\_len} di \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 diff --git a/socket.tex b/socket.tex index bda4160..30412e0 100644 --- a/socket.tex +++ b/socket.tex @@ -514,7 +514,7 @@ sez.~\ref{sec:TCP_func_bind}) su queste porte. 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. diff --git a/system.tex b/system.tex index ca05109..ce09475 100644 --- a/system.tex +++ b/system.tex @@ -679,7 +679,7 @@ modalità per effettuare lo spegnimento o il riavvio di una macchina. 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 @@ -689,7 +689,7 @@ file. 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 @@ -856,7 +856,6 @@ prototipi sono: 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 @@ -2099,7 +2098,7 @@ operativi,\footnote{è possibile, ancorché assolutamente sconsigliabile, 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. @@ -2156,6 +2155,7 @@ sistema come vedremo seguono questa convenzione, in tal caso il numero di 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 @@ -2174,6 +2174,8 @@ valori determinino anche la corrispondente durata dei \textit{clock tick}, ma 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 @@ -2814,7 +2816,7 @@ chiamando direttamente la funzione \funcd{tzset}, il cui prototipo è: 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} @@ -2971,7 +2973,7 @@ come un cosiddetto ``\textit{modifiable lvalue}'', cosa che consente di usare anche una macro, e questo è infatti il metodo usato da Linux per renderla locale ai singoli \itindex{thread} \textit{thread}. -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 diff --git a/tcpsock.tex b/tcpsock.tex index d0dea20..b07e6fd 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -761,7 +761,7 @@ con una struttura, perché il linguaggio C non consente l'uso di una struttura 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 -- 2.30.2