From ffb12837c5ed8ccc095bc9c88349cd19b5e6b472 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 16 Jan 2012 23:28:00 +0000 Subject: [PATCH] Reindicizzazioni e correzioni varie --- errors.tex | 2 +- fileadv.tex | 48 ++++----- filedir.tex | 267 +++++++++++++++++++++++++++------------------------ filestd.tex | 23 ++--- fileunix.tex | 55 ++++++----- intro.tex | 15 +-- ipc.tex | 70 +++++++------- macro.tex | 10 +- process.tex | 138 +++++++++++++------------- prochand.tex | 32 +++--- session.tex | 65 +++++++------ signal.tex | 46 ++++----- sockctrl.tex | 82 ++++++++-------- socket.tex | 41 ++++---- system.tex | 141 +++++++++++++-------------- tcpsock.tex | 6 +- 16 files changed, 535 insertions(+), 506 deletions(-) diff --git a/errors.tex b/errors.tex index 4aa369a..7cf46fc 100644 --- a/errors.tex +++ b/errors.tex @@ -13,7 +13,7 @@ \label{cha:errors} Si riportano in questa appendice tutti i codici di errore. Essi sono -accessibili attraverso l'inclusione del file di header \file{errno.h}, che +accessibili attraverso l'inclusione del file di header \headfile{errno.h}, che definisce anche la \index{variabili!globali} variabile globale \var{errno}. Per ogni errore definito riporteremo la stringa stampata da \func{perror} ed una breve spiegazione. Si tenga presente che spiegazioni più diff --git a/fileadv.tex b/fileadv.tex index ade65bc..b35d14c 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -226,13 +226,13 @@ agisce sempre su di un file; perciò le informazioni relative agli eventuali inode\itindex{inode},\footnote{in particolare, come accennato in fig.~\ref{fig:file_flock_struct}, i \textit{file lock} sono mantenuti in una \itindex{linked~list} \textit{linked list} di strutture - \struct{file\_lock}. La lista è referenziata dall'indirizzo di partenza - mantenuto dal campo \var{i\_flock} della struttura \struct{inode} (per le - definizioni esatte si faccia riferimento al file \file{fs.h} nei sorgenti - del kernel). Un bit del campo \var{fl\_flags} di specifica se si tratta di - un lock in semantica BSD (\const{FL\_FLOCK}) o POSIX (\const{FL\_POSIX}).} -dato che questo è l'unico riferimento in comune che possono avere due processi -diversi che aprono lo stesso file. + \kstruct{file\_lock}. La lista è referenziata dall'indirizzo di partenza + mantenuto dal campo \var{i\_flock} della struttura \kstruct{inode} (per le + definizioni esatte si faccia riferimento al file \file{include/linux/fs.h} + nei sorgenti del kernel). Un bit del campo \var{fl\_flags} di specifica se + si tratta di un lock in semantica BSD (\const{FL\_FLOCK}) o POSIX + (\const{FL\_POSIX}).} dato che questo è l'unico riferimento in comune che +possono avere due processi diversi che aprono lo stesso file. \begin{figure}[!htb] \centering @@ -1033,7 +1033,7 @@ al limite per il numero massimo di file aperti\footnote{ad esempio in Linux, quando, come nelle versioni più recenti del kernel, questo limite è stato rimosso, esso indica le dimensioni massime dei numeri usati nei \textit{file descriptor set}.\footnote{il suo valore, secondo lo standard POSIX - 1003.1-2001, è definito in \file{sys/select.h}, ed è pari a 1024.} + 1003.1-2001, è definito in \headfile{sys/select.h}, ed è pari a 1024.} Si tenga presente che i \textit{file descriptor set} devono sempre essere inizializzati con \macro{FD\_ZERO}; passare a \func{select} un valore non @@ -1127,12 +1127,12 @@ Lo standard POSIX è rimasto a lungo senza primitive per l'\textit{I/O multiplexing}, introdotto solo con le ultime revisioni dello standard (POSIX 1003.1g-2000 e POSIX 1003.1-2001). La scelta è stata quella di seguire l'interfaccia creata da BSD, ma prevede che tutte le funzioni ad esso relative -vengano dichiarate nell'header \file{sys/select.h}, che sostituisce i +vengano dichiarate nell'header \headfile{sys/select.h}, che sostituisce i precedenti, ed inoltre aggiunge a \func{select} una nuova funzione \funcd{pselect},\footnote{il supporto per lo standard POSIX 1003.1-2001, ed - l'header \file{sys/select.h}, compaiono in Linux a partire dalle \acr{glibc} - 2.1. Le \acr{libc4} e \acr{libc5} non contengono questo header, le - \acr{glibc} 2.0 contengono una definizione sbagliata di \func{psignal}, + l'header \headfile{sys/select.h}, compaiono in Linux a partire dalle + \acr{glibc} 2.1. Le \acr{libc4} e \acr{libc5} non contengono questo header, + le \acr{glibc} 2.0 contengono una definizione sbagliata di \func{psignal}, senza l'argomento \param{sigmask}, la definizione corretta è presente dalle \acr{glibc} 2.1-2.2.1 se si è definito \macro{\_GNU\_SOURCE} e nelle \acr{glibc} 2.2.2-2.2.4 se si è definito \macro{\_XOPEN\_SOURCE} con valore @@ -1339,7 +1339,7 @@ normali e prioritari, vale a dire \const{POLLRDNORM}, \const{POLLWRNORM}, in stile SysV (in particolare le ultime due non vengono usate su Linux), e sono utilizzabili soltanto qualora si sia definita la macro \macro{\_XOPEN\_SOURCE}.\footnote{e ci si ricordi di farlo sempre in testa al - file, definirla soltanto prima di includere \file{sys/poll.h} non è + file, definirla soltanto prima di includere \headfile{sys/poll.h} non è sufficiente.} In caso di successo funzione ritorna restituendo il numero di file (un valore @@ -2164,7 +2164,7 @@ segnali. Una volta completata l'inizializzazione verrà eseguito indefinitamente il ciclo principale del programma (\texttt{\small 2--45}) che si è riportato in fig.~\ref{fig:fiforeporter_code_body}, fintanto che questo non riceva un -segnale di \texttt{SIGINT} (ad esempio con la pressione di \texttt{C-c}). Il +segnale di \signal{SIGINT} (ad esempio con la pressione di \texttt{C-c}). Il ciclo prevede che si attenda (\texttt{\small 2--3}) la presenza di un file descriptor pronto in lettura con \func{epoll\_wait},\footnote{si ricordi che entrambi i file descriptor \var{fifofd} e \var{sigfd} sono stati posti in @@ -2189,7 +2189,7 @@ Il primo condizionale (\texttt{\small 6--24}) è relativo al caso che si sia ricevuto un segnale e che il file descriptor pronto corrisponda (\texttt{\small 6}) a \var{sigfd}. Dato che in generale si possono ricevere anche notifiche relativi a più di un singolo segnale, si è scelto di leggere -una struttura \const{signalfd\_siginfo} alla volta, eseguendo la lettura +una struttura \struct{signalfd\_siginfo} alla volta, eseguendo la lettura all'interno di un ciclo (\texttt{\small 8--24}) che prosegue fintanto che vi siano dati da leggere. @@ -2211,7 +2211,7 @@ struttura \const{signalfd\_siginfo} letta in \var{siginf}\footnote{per la definizione si è omessa dal codice di fig.~\ref{fig:fiforeporter_code_init} per brevità.} ed il \textit{pid} del processo da cui lo ha ricevuto; inoltre (\texttt{\small 21--24}) si controllerà anche se il segnale ricevuto è -\var{SIGINT}, che si è preso come segnale da utilizzare per la terminazione +\signal{SIGINT}, che si è preso come segnale da utilizzare per la terminazione del programma, che verrà eseguita dopo aver rimosso il file della \textit{name fifo}. @@ -2611,7 +2611,7 @@ supportano meccanismi simili). Alcune di esse sono realizzate, e solo a partire dalla versione 2.4 del kernel, attraverso l'uso di alcuni \textsl{comandi} aggiuntivi per la funzione \func{fcntl} (vedi sez.~\ref{sec:file_fcntl}), che divengono disponibili soltanto se si è -definita la macro \macro{\_GNU\_SOURCE} prima di includere \file{fcntl.h}. +definita la macro \macro{\_GNU\_SOURCE} prima di includere \headfile{fcntl.h}. \itindbeg{file~lease} @@ -2897,7 +2897,7 @@ osservazione l'interfaccia fornisce due funzioni, la prima di queste è \bodydesc{La funzione restituisce un valore positivo in caso di successo, o $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EACCESS}] non si ha accesso in lettura al file indicato. + \item[\errcode{EACCES}] non si ha accesso in lettura al file indicato. \item[\errcode{EINVAL}] \param{mask} non contiene eventi legali o \param{fd} non è un file descriptor di \textit{inotify}. \item[\errcode{ENOSPC}] si è raggiunto il numero massimo di voci di @@ -3345,7 +3345,7 @@ Lo standard prevede che tutte le operazioni di I/O asincrono siano controllate attraverso l'uso di una apposita struttura \struct{aiocb} (il cui nome sta per \textit{asyncronous I/O control block}), che viene passata come argomento a tutte le funzioni dell'interfaccia. La sua definizione, come effettuata in -\file{aio.h}, è riportata in fig.~\ref{fig:file_aiocb}. Nello steso file è +\headfile{aio.h}, è riportata in fig.~\ref{fig:file_aiocb}. Nello steso file è definita la macro \macro{\_POSIX\_ASYNCHRONOUS\_IO}, che dichiara la disponibilità dell'interfaccia per l'I/O asincrono. @@ -3546,7 +3546,7 @@ codice di errore, ed il suo codice di ritorno sarà -1, inoltre il meccanismo di notifica non verrà invocato. Se si specifica una operazione relativa ad un altro file descriptor il risultato è indeterminato. In caso di successo, i possibili valori di ritorno per \func{aio\_cancel} (anch'essi definiti in -\file{aio.h}) sono tre: +\headfile{aio.h}) sono tre: \begin{basedescript}{\desclabelwidth{3.0cm}} \item[\const{AIO\_ALLDONE}] indica che le operazioni di cui si è richiesta la cancellazione sono state già completate, @@ -4099,7 +4099,7 @@ virtuale. Questa funzione è \funcd{mprotect} ed il suo prototipo è: \begin{errlist} \item[\errcode{EINVAL}] il valore di \param{addr} non è valido o non è un multiplo di \const{PAGE\_SIZE}. - \item[\errcode{EACCESS}] l'operazione non è consentita, ad esempio si è + \item[\errcode{EACCES}] l'operazione non è consentita, ad esempio si è cercato di marcare con \const{PROT\_WRITE} un segmento di memoria cui si ha solo accesso in lettura. % \item[\errcode{ENOMEM}] non è stato possibile allocare le risorse @@ -4159,7 +4159,7 @@ dimensione che si vuole ottenere. Infine l'argomento \param{flags} è una maschera binaria per i flag che controllano il comportamento della funzione. Il solo valore utilizzato è \const{MREMAP\_MAYMOVE}\footnote{per poter utilizzare questa costante occorre aver definito \macro{\_GNU\_SOURCE} prima - di includere \file{sys/mman.h}.} che consente di eseguire l'espansione + di includere \headfile{sys/mman.h}.} che consente di eseguire l'espansione anche quando non è possibile utilizzare il precedente indirizzo. Per questo motivo, se si è usato questo flag, la funzione può restituire un indirizzo della nuova zona di memoria che non è detto coincida con \param{old\_address}. @@ -4488,7 +4488,7 @@ La standardizzazione delle due funzioni all'interno della revisione POSIX.1-2001 prevede anche che sia possibile avere un limite al numero di elementi del vettore \param{vector}. Qualora questo sussista, esso deve essere indicato dal valore dalla costante \const{IOV\_MAX}, definita come le altre -costanti analoghe (vedi sez.~\ref{sec:sys_limits}) in \file{limits.h}; lo +costanti analoghe (vedi sez.~\ref{sec:sys_limits}) in \headfile{limits.h}; lo stesso valore deve essere ottenibile in esecuzione tramite la funzione \func{sysconf} richiedendo l'argomento \const{\_SC\_IOV\_MAX} (vedi sez.~\ref{sec:sys_sysconf}). @@ -5441,7 +5441,7 @@ livello di kernel. % LocalWords: ENFILE lenght segment violation SIGSEGV FIXED msync munmap copy % LocalWords: DoS Denial Service EXECUTABLE NORESERVE LOCKED swapping stack fs % LocalWords: GROWSDOWN ANON POPULATE prefaulting SIGBUS fifo VME fork old SFD -% LocalWords: exec atime ctime mtime mprotect addr EACCESS mremap address new +% LocalWords: exec atime ctime mtime mprotect addr mremap address new % LocalWords: long MAYMOVE realloc VMA virtual Ingo Molnar remap pages pgoff % LocalWords: dall' fault cache linker prelink advisory discrectionary lock fl % LocalWords: flock shared exclusive operation dup inode linked NFS cmd ENOLCK diff --git a/filedir.tex b/filedir.tex index 06457cf..9c2e485 100644 --- a/filedir.tex +++ b/filedir.tex @@ -374,11 +374,11 @@ fig.~\ref{fig:file_disk_filesys}, dove si hanno tre filesystem su tre partizioni. In essa per semplicità si è fatto riferimento alla struttura del filesystem \acr{ext2}, che prevede una suddivisione dei dati in \textit{block group}. All'interno di ciascun \textit{block group} viene anzitutto -replicato il cosiddetto \textit{superblock}, (la struttura che contiene -l'indice iniziale del filesystem e che consente di accedere a tutti i dati -sottostanti) e creata una opportuna suddivisione dei dati e delle informazioni -per accedere agli stessi. Sulle caratteristiche di \acr{ext2} e derivati -torneremo in sez.~\ref{sec:file_ext2}. +replicato il cosiddetto \itindex{superblock} \textit{superblock}, (la +struttura che contiene l'indice iniziale del filesystem e che consente di +accedere a tutti i dati sottostanti) e creata una opportuna suddivisione dei +dati e delle informazioni per accedere agli stessi. Sulle caratteristiche di +\acr{ext2} e derivati torneremo in sez.~\ref{sec:file_ext2}. \itindbeg{inode} @@ -401,9 +401,10 @@ per i dati in essi contenuti. Se si va ad esaminare con maggiore dettaglio la strutturazione dell'informazione all'interno del filesystem \textsl{ext2}, tralasciando i dettagli relativi al funzionamento del filesystem stesso come la -strutturazione in gruppi dei blocchi, il \textit{superblock} e tutti i dati di -gestione possiamo esemplificare la situazione con uno schema come quello -esposto in fig.~\ref{fig:file_filesys_detail}. +strutturazione in gruppi dei blocchi, il \itindex{superblock} +\textit{superblock} e tutti i dati di gestione possiamo esemplificare la +situazione con uno schema come quello esposto in +fig.~\ref{fig:file_filesys_detail}. \begin{figure}[!htb] \centering @@ -566,11 +567,12 @@ riportata in fig.~\ref{fig:file_filesys_detail}, in cui la partizione è divisa in gruppi di blocchi. Ciascun gruppo di blocchi contiene una copia delle informazioni essenziali del -filesystem (i \textit{superblock} sono quindi ridondati) per una maggiore -affidabilità e possibilità di recupero in caso di corruzione del -\textit{superblock} principale. L'utilizzo di raggruppamenti di blocchi ha -inoltre degli effetti positivi nelle prestazioni dato che viene ridotta la -distanza fra i dati e la tabella degli \itindex{inode} inode. +filesystem (i \itindex{superblock} \textit{superblock} sono quindi ridondati) +per una maggiore affidabilità e possibilità di recupero in caso di corruzione +del \itindex{superblock} \textit{superblock} principale. L'utilizzo di +raggruppamenti di blocchi ha inoltre degli effetti positivi nelle prestazioni +dato che viene ridotta la distanza fra i dati e la tabella degli +\itindex{inode} inode. \begin{figure}[!htb] \centering @@ -642,11 +644,11 @@ il cui prototipo è:\footnote{la funzione è una versione specifica di Linux che o non può essere montato su \param{target} perché la directory è ancora in uso. \item[\errcode{EINVAL}] il dispositivo \param{source} presenta un - \textit{superblock} non valido, o si è cercato di rimontare un filesystem - non ancora montato, o di montarlo senza che \param{target} sia un - \itindex{mount~point} \textit{mount point} o di spostarlo - quando \param{target} non è un \itindex{mount~point} \textit{mount point} - o è la radice. + \itindex{superblock} \textit{superblock} non valido, o si è cercato di + rimontare un filesystem non ancora montato, o di montarlo senza + che \param{target} sia un \itindex{mount~point} \textit{mount point} o di + spostarlo quando \param{target} non è un \itindex{mount~point} + \textit{mount point} o è la radice. \item[\errcode{ELOOP}] si è cercato di spostare un \itindex{mount~point} \textit{mount point} su una sottodirectory di \param{source} o si sono incontrati troppi link simolici nella risoluzione di un nome. @@ -898,22 +900,22 @@ identificati dalle costanti riportate nell'elenco seguente: dell'amministratore o 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 - tratta di una delle nuove opzioni (insieme a \const{MS\_SHARED}, - \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}) facenti parte - dell'infrastruttura degli \itindex{shared~subtree} \textit{shared subtree} - introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei - \itindex{bind~mount} \textit{bind mount}. In questo caso +\item[\const{MS\_PRIVATE}] Marca un \itindex{mount~point} \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 \itindex{shared~subtree} \textit{shared + subtree} introdotta a partire dal kernel 2.6.15, che estendono le + funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso \param{target} dovrà fare riferimento al \textit{mount point} che si intende marcare, e tutti gli altri argomenti verranno ignorati. Di default, finché non lo si marca altrimenti con una delle altre opzioni dell'interfaccia \itindex{shared~subtree} \textit{shared subtree}, ogni \textit{mount point} è privato. Ogni \textit{bind mount} ottenuto da un - \textit{mount point} di tipo \textit{private} si comporta come descritto - nella trattazione di \const{MS\_BIND}. Si usa questo flag principalmente per - revocare gli effetti delle altre opzioni e riportare il comportamento a - quello ordinario. + \itindex{mount~point} \textit{mount point} di tipo \textit{private} si + comporta come descritto nella trattazione di \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, non sarà possibile nessuna modifica ai suoi contenuti. Viene usato tutte le @@ -922,13 +924,13 @@ identificati dalle costanti riportate nell'elenco seguente: 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} - presenti al di sotto del \textit{mount point} indicato gli effetti della - opzione degli \itindex{shared~subtree} \textit{shared subtree} - associata. Anche questo caso l'argomento \param{target} deve fare - riferimento ad un \textit{mount point} e tutti gli altri argomenti sono - ignorati, ed il flag deve essere indicato assieme ad una fra - \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e +\item[\const{MS\_REC}] Applica ricorsivamente a tutti i \itindex{mount~point} + \textit{mount point} presenti al di sotto del \textit{mount point} indicato + gli effetti della opzione degli \itindex{shared~subtree} \textit{shared + subtree} associata. Anche questo caso l'argomento \param{target} deve fare + riferimento ad un \itindex{mount~point} \textit{mount point} e tutti gli + altri argomenti sono ignorati, ed il flag deve essere indicato assieme ad + una fra \const{MS\_PRIVATE}, \const{MS\_SHARED}, \const{MS\_SLAVE} e \const{MS\_UNBINDABLE}. \item[\const{MS\_RELATIME}] Indica di effettuare l'aggiornamento degli @@ -967,14 +969,15 @@ identificati dalle costanti riportate nell'elenco seguente: \const{MS\_NOATIME} e \const{MS\_NODIRATIME}, ed infine prima del kernel 2.4.10 anche \const{MS\_NODEV}, \const{MS\_NOEXEC} e \const{MS\_NOSUID}. -\item[\const{MS\_SHARED}] Marca un \textit{mount point} come \textit{shared - mount}. Si tratta di una delle nuove opzioni (insieme a +\item[\const{MS\_SHARED}] Marca un \itindex{mount~point} \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 degli \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei \itindex{bind~mount} \textit{bind mount}. In questo caso - \param{target} dovrà fare riferimento al \textit{mount point} che si intende - marcare, e tutti gli altri argomenti verranno ignorati. + \param{target} dovrà fare riferimento al \itindex{mount~point} \textit{mount + point} che si intende marcare, e tutti gli altri argomenti verranno + ignorati. Lo scopo dell'opzione è ottenere che tutti i successivi \textit{bind mount} effettuati da un \textit{mount point} marcato da essa siano di tipo @@ -991,8 +994,8 @@ identificati dalle costanti riportate nell'elenco seguente: 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 - mount}. Si tratta di una delle nuove opzioni (insieme a +\item[\const{MS\_SLAVE}] Marca un \itindex{mount~point} \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 \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal kernel 2.6.15, che estendono le @@ -1008,7 +1011,8 @@ identificati dalle costanti riportate nell'elenco seguente: questo caso vengono ``\textsl{propagate}'' soltanto dal \textit{mount point} originale (detto anche \textit{master}) verso gli \textit{slave}, mentre essi potranno eseguire al loro interno ulteriori montaggi che non saranno - propagati né negli altri né nel \textit{mount point} originale. + propagati né negli altri né nel \itindex{mount~point} \textit{mount point} + originale. \item[\const{MS\_STRICTATIME}] Ripristina il comportamento tradizionale per cui l'\textit{access time} viene aggiornato ad ogni accesso al @@ -1028,25 +1032,26 @@ identificati 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 - \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 \itindex{shared~subtree} \textit{shared subtree} - introdotta a partire dal kernel 2.6.15, che estendono le funzionalità dei - \itindex{bind~mount} \textit{bind mount}. In questo caso +\item[\const{MS\_UNBINDABLE}] Marca un \itindex{mount~point} \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 + \itindex{shared~subtree} \textit{shared subtree} introdotta a partire dal + kernel 2.6.15, che estendono le funzionalità dei \itindex{bind~mount} + \textit{bind mount}. In questo caso \param{target} dovrà fare riferimento al \textit{mount point} che si intende marcare, e tutti gli altri argomenti verranno ignorati. Un \textit{mount point} marcato in questo modo disabilità la capacità di eseguire dei \itindex{bind~mount} \textit{bind mount}. Si comporta cioè come - allo stesso modo di un \textit{mount point} ordinario di tipo - \textit{private} con in più la restrizione che nessuna sua sottodirectory - (anche se relativa ad un ulteriore montaggio) possa essere utilizzata per un - come sorgente di un \itindex{bind~mount} \textit{bind mount}. + allo stesso modo di un \itindex{mount~point} \textit{mount point} ordinario + di tipo \textit{private} con in più la restrizione che nessuna sua + sottodirectory (anche se relativa ad un ulteriore montaggio) possa essere + utilizzata per un come sorgente di un \itindex{bind~mount} \textit{bind + mount}. \end{basedescript} - % NOTE per \const{MS\_SLAVE},\const{MS\_SHARE}, \const{MS\_PRIVATE} e % \const{MS\_UNBINDABLE} dal 2.6.15 vedi shared subtrees, in particolare % * http://lwn.net/Articles/159077/ e @@ -1073,8 +1078,9 @@ Una volta che non si voglia più utilizzare un certo filesystem è possibile nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. - \item[\errcode{EBUSY}] \param{target} è la directory di lavoro di qualche - processo, o contiene dei file aperti, o un altro mount point. + \item[\errcode{EBUSY}] \param{target} è la \index{directory~di~lavoro} + directory di lavoro di qualche processo, o contiene dei file aperti, o un + altro mount point. \end{errlist}ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM}, \errval{ENAMETOOLONG}, \errval{ENOENT}, \errval{ELOOP} nel loro significato generico.} @@ -1084,16 +1090,16 @@ La funzione prende il nome della directory su cui il filesystem è montato e non il file o il dispositivo che è stato montato,\footnote{questo è vero a partire dal kernel 2.3.99-pre7, prima esistevano due chiamate separate e la funzione poteva essere usata anche specificando il file di dispositivo.} in -quanto con il kernel 2.4.x è possibile montare lo stesso dispositivo in più -punti. Nel caso più di un filesystem sia stato montato sullo stesso -\itindex{mount~point} \textit{mount point} viene smontato quello che è stato -montato per ultimo. +quanto a partire dai kernel della serie 2.4.x è possibile montare lo stesso +dispositivo in più punti. Nel caso più di un filesystem sia stato montato +sullo stesso \itindex{mount~point} \textit{mount point} viene smontato quello +che è stato montato per ultimo. Si tenga presente che la funzione fallisce quando il filesystem è -\textsl{occupato}, questo avviene quando ci sono ancora file aperti sul -filesystem, se questo contiene la directory di lavoro corrente di un qualunque -processo o il \itindex{mount~point} \textit{mount point} di un altro -filesystem; in questo caso l'errore restituito è \errcode{EBUSY}. +\textsl{occupato}, cioè quando ci sono ancora dei file aperti sul filesystem, +se questo contiene la \index{directory~di~lavoro} directory di lavoro corrente +di un qualunque processo o il \itindex{mount~point} \textit{mount point} di un +altro filesystem; in questo caso l'errore restituito è \errcode{EBUSY}. Linux provvede inoltre una seconda funzione, \funcd{umount2}, che in alcuni casi permette di forzare lo smontaggio di un filesystem, anche quando questo @@ -1446,8 +1452,9 @@ nello stesso filesystem) si usa invece la funzione \funcd{rename},\footnote{la \item[\errcode{ENOTEMPTY}] \param{newpath} è una directory già esistente e non vuota. \item[\errcode{EBUSY}] o \param{oldpath} o \param{newpath} sono in uso da - parte di qualche processo (come directory di lavoro o come radice) o del - sistema (come \itindex{mount~point} \textit{mount point}). + parte di qualche processo (come \index{directory~di~lavoro} directory di + lavoro o come radice) o del sistema (come \itindex{mount~point} + \textit{mount point}). \item[\errcode{EINVAL}] \param{newpath} contiene un prefisso di \param{oldpath} o più in generale si è cercato di creare una directory come sotto-directory di se stessa. @@ -1748,8 +1755,9 @@ La funzione che permette la cancellazione di una directory è invece che contiene la directory che si vuole cancellare, o non c'è il permesso di attraversare (esecuzione) una delle directory specificate in \param{dirname}. - \item[\errcode{EBUSY}] la directory specificata è la directory di lavoro o la - radice di qualche processo. + \item[\errcode{EBUSY}] la directory specificata è la + \index{directory~di~lavoro} directory di lavoro o la radice di qualche + processo. \item[\errcode{ENOTEMPTY}] la directory non è vuota. \end{errlist} ed inoltre anche \errval{EFAULT}, \errval{ENAMETOOLONG}, \errval{ENOENT}, @@ -1884,8 +1892,8 @@ comportato il passaggio di \type{dev\_t} a \index{tipo!opaco} tipo opaco, e la necessità di specificare il numero tramite delle opportune macro, così da non avere problemi di compatibilità con eventuali ulteriori estensioni. -Le macro sono definite nel file \file{sys/sysmacros.h}, che viene -automaticamente incluso quando si include \file{sys/types.h}; si possono +Le macro sono definite nel file \headfile{sys/sysmacros.h}, che viene +automaticamente incluso quando si include \headfile{sys/types.h}; si possono pertanto ottenere i valori del \itindex{major~number} \textit{major number} e \itindex{minor~number} \textit{minor number} di un dispositivo rispettivamente con le macro \macro{major} e \macro{minor}: @@ -2013,7 +2021,7 @@ La funzione restituisce il file descriptor associato al \textit{directory stream} \param{dir}. Di solito si utilizza questa funzione in abbinamento a funzioni che operano sui file descriptor, ad esempio si potrà usare \func{fstat} per ottenere le proprietà della directory, o \func{fchdir} per -spostare su di essa la directory di lavoro (vedi +spostare su di essa la \index{directory~di~lavoro} directory di lavoro (vedi sez.~\ref{sec:file_work_dir}). Viceversa se si è aperto un file descriptor corrispondente ad una directory è @@ -2370,17 +2378,18 @@ una directory. La funzione inizia con l'aprire (\texttt{\small 18--22}) uno stream sulla directory passata come primo argomento, stampando un messaggio in caso di errore. -Il passo successivo (\texttt{\small 23--24}) è cambiare directory di lavoro -(vedi sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni -\func{dirfd} e \func{fchdir} (in realtà si sarebbe potuto usare direttamente -\func{chdir} su \var{dirname}), in modo che durante il successivo ciclo -(\texttt{\small 26--30}) sulle singole voci dello stream ci si trovi -all'interno della directory.\footnote{questo è essenziale al funzionamento - della funzione \code{do\_ls}, e ad ogni funzione che debba usare il campo - \var{d\_name}, in quanto i nomi dei file memorizzati all'interno di una - struttura \struct{dirent} sono sempre relativi alla directory in questione, - e senza questo posizionamento non si sarebbe potuto usare \func{stat} per - ottenere le dimensioni.} +Il passo successivo (\texttt{\small 23--24}) è cambiare +\index{directory~di~lavoro} directory di lavoro (vedi +sez.~\ref{sec:file_work_dir}), usando in sequenza le funzioni \func{dirfd} e +\func{fchdir} (in realtà si sarebbe potuto usare direttamente \func{chdir} su +\var{dirname}), in modo che durante il successivo ciclo (\texttt{\small + 26--30}) sulle singole voci dello stream ci si trovi all'interno della +directory.\footnote{questo è essenziale al funzionamento della funzione + \code{do\_ls}, e ad ogni funzione che debba usare il campo \var{d\_name}, in + quanto i nomi dei file memorizzati all'interno di una struttura + \struct{dirent} sono sempre relativi alla directory in questione, e senza + questo posizionamento non si sarebbe potuto usare \func{stat} per ottenere + le dimensioni.} Avendo usato lo stratagemma di fare eseguire tutte le manipolazioni necessarie alla funzione passata come secondo argomento, il ciclo di scansione della @@ -2404,7 +2413,7 @@ chiusura (\texttt{\small 32}) dello stream\footnote{nel nostro caso, uscendo \label{sec:file_work_dir} \itindbeg{pathname} - +\index{directory~di~lavoro|(} Come accennato in sez.~\ref{sec:proc_fork} a ciascun processo è associata una directory nel filesystem,\footnote{questa viene mantenuta all'interno dei dati della sua \struct{task\_struct} (vedi fig.~\ref{fig:proc_task_struct}), più @@ -2482,11 +2491,11 @@ la directory corrente (vale a dire ``\texttt{.}'') e tornarvi in seguito con Una seconda usata per ottenere la directory di lavoro è \code{char *get\_current\_dir\_name(void)} che è sostanzialmente equivalente ad una \code{getcwd(NULL, 0)}, con la sola differenza che essa ritorna il valore -della variabile di ambiente \val{PWD}, che essendo costruita dalla shell può -contenere un \textit{pathname} comprendente anche dei link simbolici. Usando -\func{getcwd} infatti, essendo il \textit{pathname} ricavato risalendo -all'indietro l'albero della directory, si perderebbe traccia di ogni passaggio -attraverso eventuali link simbolici. +della variabile di ambiente \envvar{PWD}, che essendo costruita dalla shell +può contenere un \textit{pathname} comprendente anche dei link +simbolici. Usando \func{getcwd} infatti, essendo il \textit{pathname} ricavato +risalendo all'indietro l'albero della directory, si perderebbe traccia di ogni +passaggio attraverso eventuali link simbolici. Per cambiare la directory di lavoro si può usare la funzione \funcd{chdir} (equivalente del comando di shell \cmd{cd}) il cui nome sta appunto per @@ -2525,7 +2534,7 @@ quello in cui il processo non ha il permesso di accesso alla directory specificata da \param{fd}. \itindend{pathname} - +\index{directory~di~lavoro|)} \subsection{I file temporanei} @@ -2562,7 +2571,7 @@ massimo di \const{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 \const{L\_tmpnam}, \const{P\_tmpdir} e \const{TMP\_MAX} sono definite in - \file{stdio.h}.} + \headfile{stdio.h}.} Di questa funzione esiste una versione \index{funzioni!rientranti} rientrante, \func{tmpnam\_r}, che non fa nulla quando si passa \val{NULL} come argomento. @@ -2583,7 +2592,7 @@ 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 \const{TMPDIR} (non ha effetto se non è +\item La variabile di ambiente \envvar{TMPDIR} (non ha effetto se non è definita o se il programma chiamante è \itindex{suid~bit} \acr{suid} o \itindex{sgid~bit} \acr{sgid}, vedi sez.~\ref{sec:file_special_perm}). \item il valore dell'argomento \param{dir} (se diverso da \val{NULL}). @@ -2681,7 +2690,7 @@ sez.~\ref{sec:file_perm_overview}) sono impostati al valore \code{0600} questa funzione esiste una variante \funcd{mkostemp}, introdotta specificamente dalla \acr{glibc},\footnote{la funzione è stata introdotta nella versione 2.7 delle librerie e richiede che sia definita la macro - \const{\_GNU\_SOURCE}.} il cui prototipo è: + \macro{\_GNU\_SOURCE}.} il cui prototipo è: \begin{prototype}{stlib.h}{int mkostemp(char *template, int flags)} Genera un file temporaneo. @@ -2764,7 +2773,7 @@ riferimento. Infine \func{fstat} esegue la stessa operazione su un file già aperto, specificato tramite il suo file descriptor \param{filedes}. La struttura \struct{stat} usata da queste funzioni è definita nell'header -\file{sys/stat.h} e in generale dipende dall'implementazione; la versione +\headfile{sys/stat.h} e in generale dipende dall'implementazione; la versione usata da Linux è mostrata in fig.~\ref{fig:file_stat_struct}, così come riportata dalla pagina di manuale di \func{stat}; in realtà la definizione effettivamente usata nel kernel dipende dall'architettura e ha altri campi @@ -2785,7 +2794,7 @@ sez.~\ref{sec:file_file_times}), o per il padding dei campi. Si noti come i vari membri della struttura siano specificati come tipi primitivi del sistema (di quelli definiti in -tab.~\ref{tab:intro_primitive_types}, e dichiarati in \file{sys/types.h}). +tab.~\ref{tab:intro_primitive_types}, e dichiarati in \headfile{sys/types.h}). \subsection{I tipi di file} \label{sec:file_types} @@ -2819,14 +2828,14 @@ riportato in tab.~\ref{tab:file_type_macro}. \macro{S\_ISSOCK}\texttt{(m)} & socket.\\ \hline \end{tabular} - \caption{Macro per i tipi di file (definite in \texttt{sys/stat.h}).} + \caption{Macro per i tipi di file (definite in \headfile{sys/stat.h}).} \label{tab:file_type_macro} \end{table} Oltre alle macro di tab.~\ref{tab:file_type_macro} è possibile usare direttamente il valore di \var{st\_mode} per ricavare il tipo di file controllando direttamente i vari bit in esso memorizzati. Per questo sempre in -\file{sys/stat.h} sono definite le costanti numeriche riportate in +\headfile{sys/stat.h} sono definite le costanti numeriche riportate in tab.~\ref{tab:file_mode_flags}. Il primo valore dell'elenco di tab.~\ref{tab:file_mode_flags} è la maschera @@ -2873,7 +2882,7 @@ un'opportuna combinazione. \hline \end{tabular} \caption{Costanti per l'identificazione dei vari bit che compongono il campo - \var{st\_mode} (definite in \file{sys/stat.h}).} + \var{st\_mode} (definite in \headfile{sys/stat.h}).} \label{tab:file_mode_flags} \end{table} @@ -6121,13 +6130,14 @@ Un elenco delle delle \textit{capabilities} disponibili su Linux, con una breve descrizione ed il nome delle costanti che le identificano, è riportato in tab.~\ref{tab:proc_capabilities};\footnote{l'elenco presentato questa tabella, ripreso dalla pagina di manuale (accessibile con \texttt{man - capabilities}) e dalle definizioni in \texttt{linux/capabilities.h}, è - aggiornato al kernel 2.6.26.} la tabella è divisa in due parti, la prima -riporta le \textit{capabilities} previste anche nella bozza dello standard -POSIX1.e, la seconda quelle specifiche di Linux. Come si può notare dalla -tabella alcune \textit{capabilities} attengono a singole funzionalità e sono -molto specializzate, mentre altre hanno un campo di applicazione molto vasto, -che è opportuno dettagliare maggiormente. + capabilities}) e dalle definizioni in + \texttt{include/linux/capabilities.h}, è aggiornato al kernel 2.6.26.} la +tabella è divisa in due parti, la prima riporta le \textit{capabilities} +previste anche nella bozza dello standard POSIX1.e, la seconda quelle +specifiche di Linux. Come si può notare dalla tabella alcune +\textit{capabilities} attengono a singole funzionalità e sono molto +specializzate, mentre altre hanno un campo di applicazione molto vasto, che è +opportuno dettagliare maggiormente. \begin{table}[!h!btp] \centering @@ -6395,8 +6405,9 @@ fig.~\ref{fig:cap_kernel_struct}. Per un certo periodo di tempo era anche indicato che per poterle utilizzare fosse necessario che la macro \macro{\_POSIX\_SOURCE} risultasse non definita (ed era richiesto di inserire una istruzione \texttt{\#undef \_POSIX\_SOURCE} prima di includere -\texttt{sys/capability.h}) requisito che non risulta più presente.\footnote{e - non è chiaro neanche quanto sia mai stato davvero necessario.} +\headfile{sys/capability.h}) requisito che non risulta più +presente.\footnote{e non è chiaro neanche quanto sia mai stato davvero + necessario.} Si tenga presente che le strutture di fig.~\ref{fig:cap_kernel_struct}, come i prototipi delle due funzioni \func{capget} e \func{capset}, sono soggette ad @@ -6591,8 +6602,8 @@ La funzione richiede che si indichi quale degli insiemi si intente cancellare con l'argomento \param{flag}. Questo deve essere specificato con una variabile di tipo \type{cap\_flag\_t} che può assumere esclusivamente\footnote{si tratta in effetti di un tipo enumerato, come si può verificare dalla sua - definizione che si trova in \texttt{/usr/include/sys/capability.h}.} uno dei -valori illustrati in tab.~\ref{tab:cap_set_identifier}. + definizione che si trova in \headfile{sys/capability.h}.} uno dei valori +illustrati in tab.~\ref{tab:cap_set_identifier}. Si possono inoltre confrontare in maniera diretta due diversi \textit{capability state} con la funzione \funcd{cap\_compare}; il suo @@ -6656,7 +6667,7 @@ prendere come valore uno qualunque di quelli riportati in tab.~\ref{tab:proc_capabilities}, in questo caso però non è possibile combinare diversi valori in una maschera binaria, una variabile di tipo \type{cap\_value\_t} può indicare una sola capacità.\footnote{in - \texttt{sys/capability.h} il tipo \type{cap\_value\_t} è definito come + \headfile{sys/capability.h} il tipo \type{cap\_value\_t} è definito come \ctyp{int}, ma i valori validi sono soltanto quelli di tab.~\ref{tab:proc_capabilities}.} @@ -6849,7 +6860,7 @@ specifico occorre usare la funzione \funcd{capgetp}, il cui prototipo\footnote{su alcune pagine di manuale la funzione è descritta con un prototipo sbagliato, che prevede un valore di ritorno di tipo \type{cap\_t}, ma il valore di ritorno è intero, come si può verificare anche dalla - dichiarazione della stessa in \texttt{sys/capability.h}.} è: + dichiarazione della stessa in \headfile{sys/capability.h}.} è: \begin{functions} \headdecl{sys/capability.h} @@ -6966,19 +6977,20 @@ questa sezione. % TODO riferimenti ai bind mount, link simbolici ecc. Come accennato in sez.~\ref{sec:proc_fork} ogni processo oltre ad una -directory di lavoro, ha anche una directory \textsl{radice}\footnote{entrambe - sono contenute in due campi (rispettivamente \var{pwd} e \var{root}) di - \struct{fs\_struct}; vedi fig.~\ref{fig:proc_task_struct}.} che, pur essendo -di norma corrispondente alla radice dell'albero di file e directory come visto -dal kernel (ed illustrato in sez.~\ref{sec:file_pathname}), ha per il processo -il significato specifico di directory rispetto alla quale vengono risolti i +\index{directory~di~lavoro} directory di lavoro, ha anche una directory +\textsl{radice}\footnote{entrambe sono contenute in due campi (rispettivamente + \var{pwd} e \var{root}) di \struct{fs\_struct}; vedi + fig.~\ref{fig:proc_task_struct}.} che, pur essendo di norma corrispondente +alla radice dell'albero di file e directory come visto dal kernel (ed +illustrato in sez.~\ref{sec:file_pathname}), 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 \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 +\itindsub{pathname}{relativo}\textit{pathname} relativi cambiando la \index{directory~di~lavoro} directory di lavoro. Normalmente la directory radice di un processo coincide anche con la radice @@ -7020,19 +7032,20 @@ cambia la directory di lavoro, che potrebbe restare fuori dalla \textit{chroot Questo è il motivo per cui la funzione è efficace solo se dopo averla eseguita si cedono i privilegi di root. Infatti se per un qualche motivo il processo -resta con la directory di lavoro fuori dalla \textit{chroot jail}, potrà -comunque accedere a tutto il resto del filesystem usando -\itindsub{pathname}{relativo}\textit{pathname} relativi, i quali, partendo -dalla directory di lavoro che è fuori della \textit{chroot jail}, potranno -(con l'uso di ``\texttt{..}'') risalire fino alla radice effettiva del -filesystem. +resta con \index{directory~di~lavoro} la directory di lavoro fuori dalla +\textit{chroot jail}, potrà comunque accedere a tutto il resto del filesystem +usando \itindsub{pathname}{relativo}\textit{pathname} relativi, i quali, +partendo dalla directory di lavoro che è fuori della \textit{chroot jail}, +potranno (con l'uso di ``\texttt{..}'') risalire fino alla radice effettiva +del filesystem. Ma se ad un processo restano i privilegi di amministratore esso potrà comunque -portare la sua directory di lavoro fuori dalla \textit{chroot jail} in cui si -trova. Basta infatti creare una nuova \textit{chroot jail} con l'uso di -\func{chroot} su una qualunque directory contenuta nell'attuale directory di -lavoro. Per questo motivo l'uso di questa funzione non ha molto senso quando -un processo necessita dei privilegi di root per le sue normali operazioni. +portare la sua \index{directory~di~lavoro} directory di lavoro fuori dalla +\textit{chroot jail} in cui si trova. Basta infatti creare una nuova +\textit{chroot jail} con l'uso di \func{chroot} su una qualunque directory +contenuta nell'attuale directory di lavoro. Per questo motivo l'uso di questa +funzione non ha molto senso quando un processo necessita dei privilegi di root +per le sue normali operazioni. Un caso tipico di uso di \func{chroot} è quello di un server FTP anonimo, in questo caso infatti si vuole che il server veda solo i file che deve diff --git a/filestd.tex b/filestd.tex index bfad103..214fb20 100644 --- a/filestd.tex +++ b/filestd.tex @@ -92,7 +92,7 @@ usare sempre puntatori del tipo \texttt{FILE *} ottenuti dalla libreria stessa (tanto che in certi casi il termine di puntatore a file è diventato sinonimo di \textit{stream}). Tutte le funzioni della libreria che operano sui file accettano come argomenti solo variabili di questo tipo, che diventa -accessibile includendo l'header file \file{stdio.h}. +accessibile includendo l'header file \headfile{stdio.h}. \subsection{Gli \textit{stream standard}} @@ -102,7 +102,7 @@ Ai tre file descriptor standard (vedi sez.~\ref{sec:file_std_descr}) aperti per ogni processo, corrispondono altrettanti \textit{stream}, che rappresentano i canali standard di input/output prestabiliti; anche questi tre \textit{stream} sono identificabili attraverso dei nomi simbolici definiti -nell'header \file{stdio.h} che sono: +nell'header \headfile{stdio.h} che sono: \begin{basedescript}{\desclabelwidth{3.0cm}} \item[\var{FILE *stdin}] Lo \textit{standard input} cioè il \textit{file @@ -422,7 +422,7 @@ notificato come tale dai valori di uscita delle varie funzioni. Nella maggior parte dei casi questo avviene con la restituzione del valore intero (di tipo \ctyp{int}) \val{EOF}\footnote{la costante deve essere negativa, le \acr{glibc} usano -1, altre implementazioni possono avere - valori diversi.} definito anch'esso nell'header \file{stdlib.h}. + valori diversi.} definito anch'esso nell'header \headfile{stdlib.h}. Dato che le funzioni dell'interfaccia degli \textit{stream} sono funzioni di libreria che si appoggiano a delle system call, esse non impostano @@ -854,9 +854,10 @@ che eccede le dimensioni del buffer. Per questo motivo le \acr{glibc} prevedono, come estensione GNU, due nuove funzioni per la gestione dell'input/output di linea, il cui uso permette di risolvere questi problemi. L'uso di queste funzioni deve essere attivato -definendo la macro \macro{\_GNU\_SOURCE} prima di includere \file{stdio.h}. La -prima delle due, \funcd{getline}, serve per leggere una linea terminata da un -newline, esattamente allo stesso modo di \func{fgets}, il suo prototipo è: +definendo la macro \macro{\_GNU\_SOURCE} prima di includere +\headfile{stdio.h}. La prima delle due, \funcd{getline}, serve per leggere una +linea terminata da un newline, esattamente allo stesso modo di \func{fgets}, +il suo prototipo è: \begin{prototype}{stdio.h} {ssize\_t getline(char **buffer, size\_t *n, FILE *stream)} Legge una linea dal file \param{stream} copiandola sul buffer indicato da \param{buffer} @@ -1433,11 +1434,11 @@ stato allocato e rimanere disponibile per tutto il tempo in cui si opera sullo \textit{stream}. In genere conviene allocarlo con \func{malloc} e disallocarlo dopo la chiusura del file; ma fintanto che il file è usato all'interno di una funzione, può anche essere usata una \index{variabili!automatiche} variabile -automatica. In \file{stdio.h} è definita la macro \const{BUFSIZ}, che indica -le dimensioni generiche del buffer di uno \textit{stream}; queste vengono -usate dalla funzione \func{setbuf}. Non è detto però che tale dimensione -corrisponda sempre al valore ottimale (che può variare a seconda del -dispositivo). +automatica. In \headfile{stdio.h} è definita la macro \const{BUFSIZ}, che +indica le dimensioni generiche del buffer di uno \textit{stream}; queste +vengono usate dalla funzione \func{setbuf}. Non è detto però che tale +dimensione corrisponda sempre al valore ottimale (che può variare a seconda +del dispositivo). Dato che la procedura di allocazione manuale è macchinosa, comporta dei rischi (come delle scritture accidentali sul buffer) e non assicura la scelta delle diff --git a/fileunix.tex b/fileunix.tex index 9b8be61..796f052 100644 --- a/fileunix.tex +++ b/fileunix.tex @@ -152,7 +152,7 @@ tab.~\ref{tab:file_std_files}. error}\\ \hline \end{tabular} - \caption{Costanti definite in \file{unistd.h} per i file standard aperti + \caption{Costanti definite in \headfile{unistd.h} per i file standard aperti alla creazione di ogni processo.} \label{tab:file_std_files} \end{table} @@ -744,7 +744,7 @@ accessibile solo attivando il supporto delle estensioni previste dalle #define _XOPEN_SOURCE 500 \end{verbatim} e si ricordi di definire questa macro prima dell'inclusione del file di -dichiarazioni \file{unistd.h}. +dichiarazioni \headfile{unistd.h}. @@ -1128,16 +1128,18 @@ file descriptor libero di valore uguale o maggiore di \param{newfd} (e se Un problema che si pone con l'uso della funzione \func{open}, così come per molte altre funzioni che accettano come argomenti dei pathname relativi, è -che, quando un pathname relativo non fa riferimento alla directory di lavoro -corrente, è possibile che alcuni dei suoi componenti vengano modificati in -parallelo alla chiamata a \func{open}, e questo lascia aperta la possibilità -di una \itindex{race~condition} \textit{race condition}. - -Inoltre come già accennato, la directory di lavoro corrente è una proprietà -del singolo processo; questo significa che quando si lavora con i -\itindex{thread} \textit{thread} essa sarà la stessa per tutti, ma esistono -molti casi in cui sarebbe invece utile che ogni singolo \itindex{thread} -\textit{thread} avesse la sua directory di lavoro. +che, quando un pathname relativo non fa riferimento alla +\index{directory~di~lavoro} directory di lavoro corrente, è possibile che +alcuni dei suoi componenti vengano modificati in parallelo alla chiamata a +\func{open}, e questo lascia aperta la possibilità di una +\itindex{race~condition} \textit{race condition}. + +Inoltre come già accennato, la \index{directory~di~lavoro} directory di lavoro +corrente è una proprietà del singolo processo; questo significa che quando si +lavora con i \itindex{thread} \textit{thread} essa sarà la stessa per tutti, +ma esistono molti casi in cui sarebbe invece utile che ogni singolo +\itindex{thread} \textit{thread} avesse la sua \index{directory~di~lavoro} +directory di lavoro. Per risolvere questi problemi, riprendendo una interfaccia già presente in Solaris, a fianco delle normali funzioni che operano sui file (come @@ -1163,8 +1165,9 @@ sarà la base della risoluzione dei 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.\footnote{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.} + \itindex{thread} \textit{thread}, si può mantenere una + \index{directory~di~lavoro} directory di lavoro diversa per ciascuno di + essi.} Questo metodo, oltre a risolvere i problemi di \itindex{race~condition} \textit{race condition}, consente anche di ottenere aumenti di prestazioni @@ -1185,7 +1188,8 @@ come: \funcdecl{int openat(int dirfd, const char *pathname, int flags, mode\_t mode))} - Apre un file usando come directory di lavoro corrente \param{dirfd}. + Apre un file usando come directory di \index{directory~di~lavoro} lavoro + corrente \param{dirfd}. \bodydesc{la funzione restituisce gli stessi valori e gli stessi codici di errore di \func{open}, ed in più: @@ -1202,10 +1206,11 @@ argomenti si utilizza un pathname relativo questo sarà risolto rispetto alla directory indicata da \param{dirfd}; qualora invece si usi un pathname assoluto \param{dirfd} verrà semplicemente ignorato. Infine se per \param{dirfd} si usa il valore speciale \const{AT\_FDCWD},\footnote{questa, - come le altre costanti \texttt{AT\_*}, è definita in \texttt{fcntl.h}, + come le altre costanti \texttt{AT\_*}, è definita in \headfile{fcntl.h}, pertanto se la si vuole usare occorrerà includere comunque questo file, anche per le funzioni che non sono definite in esso.} la risoluzione sarà -effettuata rispetto alla directory di lavoro corrente del processo. +effettuata rispetto alla directory di \index{directory~di~lavoro} lavoro +corrente del processo. Così come il comportamento, anche i valori di ritorno e le condizioni di errore delle nuove funzioni sono gli stessi delle funzioni classiche, agli @@ -1269,7 +1274,7 @@ direttamente sullo stesso o sul file da esso referenziato. Dato che in certi casi esso può fornire ulteriori indicazioni per modificare il comportamento delle funzioni, \param{flags} deve comunque essere passato come maschera binaria, ed impostato usando i valori delle appropriate costanti -\texttt{AT\_*}, definite in \texttt{fcntl.h}. +\texttt{AT\_*}, definite in \headfile{fcntl.h}. Come esempio di questo secondo tipo di funzioni possiamo considerare \funcd{fchownat}, che può essere usata per sostituire sia \func{chown} @@ -1294,7 +1299,7 @@ che \func{lchown}; il suo prototipo è: In questo caso il valore di \param{flags} stabilisce il comportamento della funzione quando la si applica ad un link simbolico, e l'unico valore -utilizzabile è \const{AT\_SYMLINK\_NOFOLLOW}\footnote{in \texttt{fcntl.h} è +utilizzabile è \const{AT\_SYMLINK\_NOFOLLOW}\footnote{in \headfile{fcntl.h} è definito anche \const{AT\_SYMLINK\_FOLLOW}, che richiede di dereferenziare i link simbolici, essendo questo però il comportamento adottato per un valore nullo di \param{flags} questo valore non viene mai usato.} che se impostato @@ -1327,7 +1332,7 @@ La funzione esegue lo stesso controllo di accesso effettuabile con il comportamento rispetto a quello ordinario di \func{access}. In questo caso esso può essere specificato come maschera binaria di due valori: \begin{basedescript}{\desclabelwidth{3.0cm}} -\item[\const{AT\_EACCESS}] se impostato \funcd{faccessat} esegue il controllo +\item[\const{AT\_EACCES}] se impostato \funcd{faccessat} esegue il controllo dei permessi usando l'\ids{UID} effettivo invece di quello reale (il comportamento di default, che riprende quello di \func{access}). \item[\const{AT\_SYMLINK\_NOFOLLOW}] se impostato \funcd{faccessat} non esegue @@ -1540,8 +1545,8 @@ di quest'ultimo non assegna bit separati alle tre diverse modalità queste costanti sono poste rispettivamente ai valori 0, 1 e 2.} Per questo motivo il valore della modalità di accesso corrente si ottiene eseguendo un AND binario del valore di ritorno di \func{fcntl} con la maschera -\const{O\_ACCMODE} (anch'essa definita in \file{fcntl.h}), che estrae i bit di -accesso dal \textit{file status flag}. +\const{O\_ACCMODE} (anch'essa definita in \headfile{fcntl.h}), che estrae i +bit di accesso dal \textit{file status flag}. @@ -1617,8 +1622,8 @@ elenco di alcuni esempi di esse è il seguente: In generale ogni dispositivo ha un suo insieme di operazioni specifiche effettuabili attraverso \func{ioctl}, tutte queste sono definite nell'header -file \file{sys/ioctl.h}, e devono essere usate solo sui dispositivi cui fanno -riferimento. Infatti anche se in genere i valori di \param{request} sono +file \headfile{sys/ioctl.h}, e devono essere usate solo sui dispositivi cui +fanno riferimento. Infatti anche se in genere i valori di \param{request} sono opportunamente differenziati a seconda del dispositivo\footnote{il kernel usa un apposito \textit{magic number} per distinguere ciascun dispositivo nella definizione delle macro da usare per \param{request}, in modo da essere @@ -1727,7 +1732,7 @@ ma le due funzioni sono rimaste. % LocalWords: Drepper path dirfd faccessat unlinkat access fchmodat chmod Di % LocalWords: fchownat chown fstatat futimesat utimes linkat mknodat mknod uid % LocalWords: readlinkat readlink renameat rename symlinkat symlink unlink gid -% LocalWords: mkfifoat mkfifo FDCWD EACCESS dereferenziazione rmdir REMOVEDIR +% LocalWords: mkfifoat mkfifo FDCWD dereferenziazione rmdir REMOVEDIR % LocalWords: epoll lsattr chattr FIOQSIZE ATFILE lutimes utimensat lchown % LocalWords: lstat owner FOLLOW diff --git a/intro.tex b/intro.tex index 6d91ca0..24e301d 100644 --- a/intro.tex +++ b/intro.tex @@ -538,9 +538,10 @@ 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; 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}. +ricerca parte dalla \index{directory~di~lavoro} 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}. Infine i nomi di directory ``\file{.}'' e ``\file{..}'' hanno un significato speciale e vengono inseriti in ogni directory quando questa viene creata (vedi @@ -714,7 +715,7 @@ interno alcune bufferizzazioni per aumentare l'efficienza nell'accesso ai dispositivi. L'accesso viene gestito attraverso i \textit{file descriptor} che sono rappresentati da numeri interi (cioè semplici variabili di tipo \ctyp{int}). L'interfaccia è definita nell'\textit{header file} -\file{unistd.h} e la tratteremo in dettaglio in +\headfile{unistd.h} e la tratteremo in dettaglio in cap.~\ref{cha:file_unix_interface}. \itindbeg{file~stream} @@ -732,7 +733,7 @@ specificata dall'ANSI C e perciò si trova anche su tutti i sistemi non Unix. Gli \textit{stream} sono oggetti complessi e sono rappresentati da puntatori ad un opportuna struttura definita dalle librerie del C, ad essi si accede sempre in maniera indiretta utilizzando il tipo \code{FILE *}. -L'interfaccia è definita nell'\textit{header file} \file{stdio.h} e la +L'interfaccia è definita nell'\textit{header file} \headfile{stdio.h} e la tratteremo in dettaglio nel cap.~\ref{cha:files_std_interface}. Entrambe le interfacce possono essere usate per l'accesso ai file come agli @@ -877,7 +878,7 @@ infinita serie di problemi di portabilità. sez.~\ref{sec:proc_access_id}).\\ \hline \end{tabular} - \caption{Elenco dei tipi primitivi, definiti in \file{sys/types.h}.} + \caption{Elenco dei tipi primitivi, definiti in \headfile{sys/types.h}.} \label{tab:intro_primitive_types} \end{table} @@ -885,7 +886,7 @@ Per questo motivo tutte le funzioni di libreria di solito non fanno riferimento ai tipi elementari dello standard del linguaggio C, ma ad una serie di \index{tipo!primitivo} \textsl{tipi primitivi} del sistema, riportati in tab.~\ref{tab:intro_primitive_types}, e definiti nell'\textit{header file} -\file{sys/types.h}, in modo da mantenere completamente indipendenti i tipi +\headfile{sys/types.h}, in modo da mantenere completamente indipendenti i tipi utilizzati dalle funzioni di sistema dai tipi elementari supportati dal compilatore C. diff --git a/ipc.tex b/ipc.tex index 9a2002c..81ad3cf 100644 --- a/ipc.tex +++ b/ipc.tex @@ -646,8 +646,8 @@ scrittura e l'apertura si sarebbe bloccata indefinitamente. Verifichiamo allora il comportamento dei nostri programmi, in questo, come in altri esempi precedenti, si fa uso delle varie funzioni di servizio, che sono state raccolte nella libreria \file{libgapil.so}, per poter usare quest'ultima -occorrerà definire la speciale variabile di ambiente \code{LD\_LIBRARY\_PATH} -in modo che il linker dinamico possa accedervi. +occorrerà definire la variabile di ambiente \envvar{LD\_LIBRARY\_PATH} in modo +che il linker dinamico possa accedervi. In generale questa variabile indica il \itindex{pathname} \textit{pathname} della directory contenente la libreria. Nell'ipotesi (che daremo sempre per @@ -844,7 +844,7 @@ mantiene varie proprietà ed informazioni associate all'oggetto. \end{minipage} \normalsize \caption{La struttura \structd{ipc\_perm}, come definita in - \file{sys/ipc.h}.} + \headfile{sys/ipc.h}.} \label{fig:ipc_ipc_perm} \end{figure} @@ -937,7 +937,7 @@ permessi di lettura e scrittura (nel caso dei semafori poi quest'ultimo è più propriamente un permesso di modifica). I valori di \var{mode} sono gli stessi ed hanno lo stesso significato di quelli riportati in tab.~\ref{tab:file_mode_flags}\footnote{se però si vogliono usare le costanti - simboliche ivi definite occorrerà includere il file \file{sys/stat.h}, + simboliche ivi definite occorrerà includere il file \headfile{sys/stat.h}, alcuni sistemi definiscono le costanti \const{MSG\_R} (\texttt{0400}) e \const{MSG\_W} (\texttt{0200}) per indicare i permessi base di lettura e scrittura per il proprietario, da utilizzare, con gli opportuni shift, pure @@ -1223,18 +1223,18 @@ cui queste strutture vengono mantenute dal kernel.\footnote{lo schema \end{figure} A ciascuna coda è associata una struttura \struct{msgid\_ds}, la cui -definizione, è riportata in fig.~\ref{fig:ipc_msqid_ds}. In questa struttura il -kernel mantiene le principali informazioni riguardo lo stato corrente della +definizione, è riportata in fig.~\ref{fig:ipc_msqid_ds}. In questa struttura +il kernel mantiene le principali informazioni riguardo lo stato corrente della coda.\footnote{come accennato questo vale fino ai kernel della serie 2.2.x, essa viene usata nei kernel della serie 2.4.x solo per compatibilità in quanto è quella restituita dalle funzioni dell'interfaccia. Si noti come ci sia una differenza con i campi mostrati nello schema di fig.~\ref{fig:ipc_mq_schema} che sono presi dalla definizione di - \file{linux/msg.h}, e fanno riferimento alla definizione della omonima - struttura usata nel kernel.} In fig.~\ref{fig:ipc_msqid_ds} sono elencati i -campi significativi definiti in \file{sys/msg.h}, a cui si sono aggiunti gli -ultimi tre campi che sono previsti dalla implementazione originale di System -V, ma non dallo standard Unix98. + \file{include/linux/msg.h}, e fanno riferimento alla definizione della + omonima struttura usata nel kernel.} In fig.~\ref{fig:ipc_msqid_ds} sono +elencati i campi significativi definiti in \headfile{sys/msg.h}, a cui si sono +aggiunti gli ultimi tre campi che sono previsti dalla implementazione +originale di System V, ma non dallo standard Unix98. Quando si crea una nuova coda con \func{msgget} questa struttura viene inizializzata, in particolare il campo \var{msg\_perm} viene inizializzato @@ -1353,12 +1353,12 @@ messaggio. La dimensione massima per il testo di un messaggio non può comunque superare il limite \const{MSGMAX}. La struttura di fig.~\ref{fig:ipc_msbuf} è comunque solo un modello, tanto che -la definizione contenuta in \file{sys/msg.h} usa esplicitamente per il secondo -campo il valore \code{mtext[1]}, che non è di nessuna utilità ai fini pratici. -La sola cosa che conta è che la struttura abbia come primo membro un campo -\var{mtype} come nell'esempio; esso infatti serve ad identificare il tipo di -messaggio e deve essere sempre specificato come intero positivo di tipo -\ctyp{long}. Il campo \var{mtext} invece può essere di qualsiasi tipo e +la definizione contenuta in \headfile{sys/msg.h} usa esplicitamente per il +secondo campo il valore \code{mtext[1]}, che non è di nessuna utilità ai fini +pratici. La sola cosa che conta è che la struttura abbia come primo membro un +campo \var{mtype} come nell'esempio; esso infatti serve ad identificare il +tipo di messaggio e deve essere sempre specificato come intero positivo di +tipo \ctyp{long}. Il campo \var{mtext} invece può essere di qualsiasi tipo e dimensione, e serve a contenere il testo del messaggio. In generale pertanto per inviare un messaggio con \func{msgsnd} si usa @@ -2781,9 +2781,9 @@ con un messaggio di errore. Poi, per verificare che l'argomento specifichi effettivamente una directory, si esegue (\texttt{\small 24--26}) su di esso una \func{chdir}, uscendo immediatamente in caso di errore. Questa funzione serve anche per impostare -la directory di lavoro del programma nella directory da tenere sotto -controllo, in vista del successivo uso della funzione -\func{daemon}.\footnote{si noti come si è potuta fare questa scelta, +la \index{directory~di~lavoro} directory di lavoro del programma nella +directory da tenere sotto controllo, in vista del successivo uso della +funzione \func{daemon}.\footnote{si noti come si è potuta fare questa scelta, nonostante le indicazioni illustrate in sez.~\ref{sec:sess_daemon}, per il particolare scopo del programma, che necessita comunque di restare all'interno di una directory.} Infine (\texttt{\small 27--29}) si installano @@ -2824,17 +2824,17 @@ intercomunicazione il programma entra nel ciclo principale (\texttt{\small Il primo passo (\texttt{\small 41}) è eseguire \func{daemon} per proseguire con l'esecuzione in background come si conviene ad un programma demone; si noti che si è mantenuta, usando un valore non nullo del primo argomento, la -directory di lavoro corrente. Una volta che il programma è andato in -background l'esecuzione prosegue (\texttt{\small 42--48}) all'interno di un -ciclo infinito: si inizia (\texttt{\small 43}) bloccando il mutex con -\func{MutexLock} per poter accedere alla memoria condivisa (la funzione si -bloccherà automaticamente se qualche client sta leggendo), poi (\texttt{\small - 44}) si cancellano i valori precedentemente immagazzinati nella memoria -condivisa con \func{memset}, e si esegue (\texttt{\small 45}) un nuovo calcolo -degli stessi utilizzando la funzione \func{DirScan}; infine (\texttt{\small - 46}) si sblocca il mutex con \func{MutexUnlock}, e si attende -(\texttt{\small 47}) per il periodo di tempo specificato a riga di comando con -l'opzione \code{-p} con una \func{sleep}. +\index{directory~di~lavoro} directory di lavoro corrente. Una volta che il +programma è andato in background l'esecuzione prosegue (\texttt{\small + 42--48}) all'interno di un ciclo infinito: si inizia (\texttt{\small 43}) +bloccando il mutex con \func{MutexLock} per poter accedere alla memoria +condivisa (la funzione si bloccherà automaticamente se qualche client sta +leggendo), poi (\texttt{\small 44}) si cancellano i valori precedentemente +immagazzinati nella memoria condivisa con \func{memset}, e si esegue +(\texttt{\small 45}) un nuovo calcolo degli stessi utilizzando la funzione +\func{DirScan}; infine (\texttt{\small 46}) si sblocca il mutex con +\func{MutexUnlock}, e si attende (\texttt{\small 47}) per il periodo di tempo +specificato a riga di comando con l'opzione \code{-p} con una \func{sleep}. Si noti come per il calcolo dei valori da mantenere nella memoria condivisa si sia usata ancora una volta la funzione \func{DirScan}, già utilizzata (e @@ -4003,7 +4003,7 @@ esistente o per crearne uno nuovi, i relativi prototipi sono: successo e \const{SEM\_FAILED} in caso di errore; nel quel caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EACCESS}] il semaforo esiste ma non si hanno permessi + \item[\errcode{EACCES}] il semaforo esiste ma non si hanno permessi sufficienti per accedervi. \item[\errcode{EEXIST}] si sono specificati \const{O\_CREAT} e \const{O\_EXCL} ma il semaforo esiste. @@ -4128,7 +4128,7 @@ programma possa proseguire. La seconda variante di \func{sem\_wait} è una estensione specifica che può essere utilizzata soltanto se viene definita la macro \macro{\_XOPEN\_SOURCE} -ad un valore di 600 prima di includere \texttt{semaphore.h}, la funzione è +ad un valore di 600 prima di includere \headfile{semaphore.h}, la funzione è \func{sem\_timedwait}, ed il suo prototipo è: \begin{functions} \headdecl{semaphore.h} @@ -4261,7 +4261,7 @@ lo si cancelli esplicitamente. Per far questo si può utilizzare la funzione \bodydesc{La funzione restituisce 0 in caso di successo e $-1$ in caso di errore; nel quel caso \var{errno} assumerà i valori: \begin{errlist} - \item[\errcode{EACCESS}] non si hanno i permessi necessari a cancellare il + \item[\errcode{EACCES}] non si hanno i permessi necessari a cancellare il semaforo. \item[\errcode{ENAMETOOLONG}] il nome indicato è troppo lungo. \item[\errcode{ENOENT}] il semaforo \param{name} non esiste. @@ -4620,7 +4620,7 @@ testo alla terminazione di quest'ultimo. % LocalWords: EBUSY sigev SIGNAL signo value sigval siginfo all'userid MESGQ % LocalWords: Konstantin Knizhnik futex tmpfs ramfs cache shared swap CONFIG % LocalWords: lrt blocks PAGECACHE TRUNC CLOEXEC mmap ftruncate munmap FindShm -% LocalWords: CreateShm RemoveShm LIBRARY Library libmqueue FAILED EACCESS has +% LocalWords: CreateShm RemoveShm LIBRARY Library libmqueue FAILED has % LocalWords: ENAMETOOLONG qualchenome RESTART trywait XOPEN SOURCE timedwait % LocalWords: process getvalue sval execve pshared ENOSYS heap PAGE destroy it % LocalWords: xffffffff Arrays owner perms Queues used bytes messages device diff --git a/macro.tex b/macro.tex index 0138e51..a952fca 100644 --- a/macro.tex +++ b/macro.tex @@ -163,9 +163,10 @@ \newcommand{\ctyp}[1]{\texttt{#1}} % C standard type \newcommand{\headfile}[1]{% -\index{file!include!{#1}@{{\tt {#1}}}}\texttt{#1}% -%\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}% +%\index{file!include!{#1}@{{\tt {#1}}}}\texttt{#1}% +\texttt{#1}% } % header file name + \newcommand{\procfile}[1]{% \index{file!filesystem~\texttt{/proc}!{#1}@{{\tt {#1}}}}\texttt{#1}% %\index{#1@{{\tt {#1}} (direttiva)}}\texttt{#1}% @@ -218,10 +219,7 @@ \newcommand{\acr}[1]{\textsl{#1}} % acrostic (for glibc, ext2, ecc.) \newcommand{\ids}[1]{\textsl{#1}} % Identifier (PID, GID, UID, TID, ecc.) - - - - +\newcommand{\envvar}[1]{\texttt{#1}} % environment variable \newcommand{\itindex}[1]{% \index{#1@{\textit{#1}}}% diff --git a/process.tex b/process.tex index db45209..c7bbfb7 100644 --- a/process.tex +++ b/process.tex @@ -73,10 +73,10 @@ Il funzionamento di \cmd{ld-linux.so} è controllato da alcune variabili di ambiente e dal contenuto del file \conffile{/etc/ld.so.conf}, che consentono di elencare le directory un cui cercare le librerie e determinare quali verranno utilizzate. In particolare con la variabile di ambiente -\texttt{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a +\envvar{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a quelle di sistema in cui inserire versioni personali delle librerie che hanno la precedenza su quelle di sistema, mentre con la variabile di ambiente -\texttt{LD\_PRELOAD} si può passare direttamente una lista di file di librerie +\envvar{LD\_PRELOAD} si può passare direttamente una lista di file di librerie condivise da usare al posto di quelli di sistema. In questo modo è possibile effettuare lo sviluppo o il test di nuove librerie senza dover sostituire quelle di sistema. Ulteriori dettagli sono riportati nella pagina di manuale @@ -142,7 +142,7 @@ evitarli, in particolare questi sono: il controllo e la conversione del tipo di caratteri, \item i nomi che iniziano con ``\texttt{LC\_}'' e costituiti da lettere maiuscole che possono essere usato per macro attinenti la - localizzazione (vedi sez.~\ref{sec:proc_localization}), + localizzazione,% mettere in seguito (vedi sez.~\ref{sec:proc_localization}), \item nomi che iniziano con ``\texttt{SIG}'' o ``\texttt{SIG\_}'' e costituiti da lettere maiuscole che potrebbero essere usati per nuovi nomi di segnale (vedi sez.~\ref{sec:sig_classification}), @@ -213,25 +213,27 @@ definizioni. & ANSI C& POSIX& \\ \hline \hline - \file{assert.h}&$\bullet$& -- & Verifica le asserzioni fatte in un - programma.\\ - \file{ctype.h} &$\bullet$& -- & Tipi standard.\\ - \file{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\ - \file{errno.h} & -- &$\bullet$& Errori di sistema.\\ - \file{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\ - \file{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\ - \file{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\ - \file{setjmp.h}&$\bullet$& -- & Salti non locali.\\ - \file{signal.h}& -- &$\bullet$& Gestione dei segnali.\\ - \file{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti - variabili.\\ - \file{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI C.\\ - \file{stdlib.h}&$\bullet$& -- & Definizioni della libreria standard.\\ - \file{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\ - \file{time.h} & -- &$\bullet$& Gestione dei tempi.\\ - \file{times.h} &$\bullet$& -- & Gestione dei tempi.\\ - \file{unistd.h}& -- &$\bullet$& Unix standard library.\\ - \file{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\ + \headfile{assert.h}&$\bullet$& -- & Verifica le asserzioni fatte in un + programma.\\ + \headfile{ctype.h} &$\bullet$& -- & Tipi standard.\\ + \headfile{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\ + \headfile{errno.h} & -- &$\bullet$& Errori di sistema.\\ + \headfile{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\ + \headfile{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\ + \headfile{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\ + \headfile{setjmp.h}&$\bullet$& -- & Salti non locali.\\ + \headfile{signal.h}& -- &$\bullet$& Gestione dei segnali.\\ + \headfile{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti + variabili.\\ + \headfile{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI + C.\\ + \headfile{stdlib.h}&$\bullet$& -- & Definizioni della libreria + standard.\\ + \headfile{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\ + \headfile{time.h} & -- &$\bullet$& Gestione dei tempi.\\ + \headfile{times.h} &$\bullet$& -- & Gestione dei tempi.\\ + \headfile{unistd.h}& -- &$\bullet$& Unix standard library.\\ + \headfile{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\ \hline \end{tabular} \caption{Elenco dei principali \textit{header file} definiti dagli standard @@ -255,24 +257,24 @@ parlato in sez.~\ref{sec:proc_main}, alcuni di questi \textit{header file} riservano degli ulteriori identificativi, il cui uso sarà da evitare, ad esempio si avrà che: \begin{itemize*} -\item in \file{dirent.h} vengono riservati i nomi che iniziano con +\item in \headfile{dirent.h} vengono riservati i nomi che iniziano con ``\texttt{d\_}'' e costituiti da lettere minuscole, -\item in \file{fcntl.h} vengono riservati i nomi che iniziano con +\item in \headfile{fcntl.h} vengono riservati i nomi che iniziano con ``\texttt{l\_}'', ``\texttt{F\_}'',``\texttt{O\_}'' e ``\texttt{S\_}'', -\item in \file{limits.h} vengono riservati i nomi che finiscono in +\item in \headfile{limits.h} vengono riservati i nomi che finiscono in ``\texttt{\_MAX}'', -\item in \file{signal.h} vengono riservati i nomi che iniziano con +\item in \headfile{signal.h} vengono riservati i nomi che iniziano con ``\texttt{sa\_}'' e ``\texttt{SA\_}'', -\item in \file{sys/stat.h} vengono riservati i nomi che iniziano con +\item in \headfile{sys/stat.h} vengono riservati i nomi che iniziano con ``\texttt{st\_}'' e ``\texttt{S\_}'', -\item in \file{sys/times.h} vengono riservati i nomi che iniziano con +\item in \headfile{sys/times.h} vengono riservati i nomi che iniziano con ``\texttt{tms\_}'', -\item in \file{termios.h} vengono riservati i nomi che iniziano con +\item in \headfile{termios.h} vengono riservati i nomi che iniziano con ``\texttt{c\_}'', ``\texttt{V}'', ``\texttt{I}'', ``\texttt{O}'' e ``\texttt{TC}'' e con ``\texttt{B}'' seguito da un numero, -\item in \file{grp.h} vengono riservati i nomi che iniziano con +\item in \headfile{grp.h} vengono riservati i nomi che iniziano con ``\texttt{gr\_}'', -\item in \file{pwd.h}vengono riservati i nomi che iniziano con +\item in \headfile{pwd.h}vengono riservati i nomi che iniziano con ``\texttt{pw\_}'', \end{itemize*} @@ -349,7 +351,7 @@ dall'architettura,\footnote{in genere le vecchie \textit{system call} non ciascuna \textit{system call} viene in genere identificata da una costante nella forma \texttt{SYS\_*} dove al prefisso viene aggiunto il nome che spesso corrisponde anche alla omonima funzione di libreria. Queste costanti sono -definite nel file \texttt{sys/syscall.h}, ma si possono anche usare +definite nel file \headfile{sys/syscall.h}, ma si possono anche usare direttamente valori numerici. @@ -422,7 +424,7 @@ un intero di valore generico può comportare il rischio, qualora si vada ad usare un multiplo di 256, di avere uno stato di uscita uguale a zero, che verrebbe interpretato come un successo. -Per questo motivo in \file{stdlib.h} sono definite, seguendo lo standard +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 @@ -432,7 +434,8 @@ valori 0 e 1. Una forma alternativa per effettuare una terminazione esplicita di un programma è quella di chiamare direttamente la \textit{system call} -\func{\_exit}, che restituisce il controllo direttamente al kernel, +\funcd{\_exit},\footnote{la stessa è definita anche come \funcd{\_Exit} in + \headfile{stdlib.h}.} che restituisce il controllo direttamente al kernel, concludendo immediatamente il processo, il suo prototipo è: \begin{funcproto}{ \fhead{unistd.h} \fdecl{void \_exit(int status)} @@ -570,7 +573,7 @@ normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. % \includegraphics[width=9cm]{img/proc_beginend} \begin{tikzpicture}[>=stealth] \filldraw[fill=black!35] (-0.3,0) rectangle (12,1); - \draw(5.5,0.5) node {\large{kernel}}; + \draw(5.5,0.5) node {\large{\textsf{kernel}}}; \filldraw[fill=black!15] (1.5,2) rectangle (4,3); \draw (2.75,2.5) node {\texttt{ld-linux.so}}; @@ -597,9 +600,9 @@ normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. \draw[->] (4,4.5) -- node[anchor=south]{\texttt{exit}} (exit); \draw[->] (exit) -- node[anchor=east]{\texttt{\_exit}}(6.75,1); - \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{exit handler}; - \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{exit handler}; - \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{chiusura stream}; + \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{\textsf{exit handler}}; + \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{\textsf{exit handler}}; + \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{\textsf{chiusura stream}}; \draw[<->, dashed] (exithandler1) -- (exit); \draw[<->, dashed] (exithandler2) -- (exit); @@ -652,7 +655,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 \file{limits.h}, indica la +la costante \const{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}). @@ -1000,7 +1003,7 @@ blocco di dati ridimensionato. La \acr{glibc} ha un'implementazione delle funzioni di allocazione che è controllabile dall'utente attraverso alcune variabili di ambiente (vedi sez.~\ref{sec:proc_environ}), in particolare diventa possibile tracciare -questo tipo di errori usando la variabile di ambiente \val{MALLOC\_CHECK\_} +questo tipo di errori usando la variabile di ambiente \envvar{MALLOC\_CHECK\_} che quando viene definita mette in uso una versione meno efficiente delle funzioni suddette, che però è più tollerante nei confronti di piccoli errori come quello dei \itindex{double~free} \textit{double~free} o i @@ -1332,7 +1335,7 @@ automaticamente rimossi se si pone in esecuzione un altro programma con 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 \file{unistd.h} la macro +standard POSIX.1 richiede che sia definita in \headfile{unistd.h} la macro \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il \textit{memory locking}. @@ -1536,9 +1539,9 @@ cosa che non è detto accada con altre implementazioni. Nessuna delle due funzioni ha una chiara standardizzazione e nessuna delle due compare in POSIX.1, inoltre ci sono indicazioni discordi sui file che ne contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in - \texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e - \acr{libc5} la dichiarano in \texttt{malloc.h}, lo stesso vale per - \func{memalign} che in alcuni sistemi è dichiarata in \texttt{stdlib.h}.} + \headfile{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} + e \acr{libc5} la dichiarano in \headfile{malloc.h}, lo stesso vale per + \func{memalign} che in alcuni sistemi è dichiarata in \headfile{stdlib.h}.} per questo motivo il loro uso è sconsigliato, essendo state sostituite dalla nuova \funcd{posix\_memalign}, che è stata standardizzata in POSIX.1d; il suo prototipo è: @@ -1583,8 +1586,8 @@ allocazione,\footnote{entrambe queste operazioni causano in genere la Abbiamo visto in sez.~\ref{sec:proc_mem_lock} come una prima funzionalità di ausilio nella ricerca di questi errori sia l'uso della variabile di ambiente -\var{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei controlli -di consistenza sullo stato delle allocazioni di memoria eseguite con +\envvar{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei +controlli di consistenza sullo stato delle allocazioni di memoria eseguite con \func{malloc}, anche questa fornita come estensione specifica (e non standard) della \acr{glibc}, è quella di utilizzare la funzione \funcd{mcheck}, che deve essere chiamata prima di eseguire qualunque allocazione con \func{malloc}; il @@ -1945,17 +1948,18 @@ configurazione. É di norma cura della shell, quando esegue un comando, passare queste variabili al programma messo in esecuzione attraverso un uso opportuno delle relative chiamate (si veda sez.~\ref{sec:proc_exec}). -La shell ad esempio ne usa molte per il suo funzionamento, come \texttt{PATH} +La shell ad esempio ne usa molte per il suo funzionamento, come \envvar{PATH} per indicare la lista delle directory in cui effettuare la ricerca dei comandi -o \texttt{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come -\texttt{HOME}, \texttt{USER}, ecc. sono invece definite al login (per i +o \envvar{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come +\envvar{HOME}, \envvar{USER}, ecc. sono invece definite al login (per i dettagli si veda sez.~\ref{sec:sess_login}), ed in genere è cura della propria distribuzione definire le opportune variabili di ambiente in uno script di avvio. Alcune servono poi come riferimento generico per molti programmi, come -\texttt{EDITOR} che indica l'editor preferito da invocare in caso di -necessità. Una in particolare, \texttt{LANG}, serve a controllare la -localizzazione del programma (su cui torneremo in -sez.~\ref{sec:proc_localization}) per adattarlo alla lingua ed alle convezioni +\envvar{EDITOR} che indica l'editor preferito da invocare in caso di +necessità. Una in particolare, \envvar{LANG}, serve a controllare la +localizzazione del programma +%(su cui torneremo in sez.~\ref{sec:proc_localization}) +per adattarlo alla lingua ed alle convezioni dei vari paesi. Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più @@ -2180,20 +2184,20 @@ versione ``\textsl{sicura}'' da zero. \index{variabili!di~ambiente|)} -\subsection{La localizzazione} -\label{sec:proc_localization} +% \subsection{La localizzazione} +% \label{sec:proc_localization} -Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente -\texttt{LANG} sia usata per indicare ai processi il valore della cosiddetta -\textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie -di sistema\footnote{prenderemo in esame soltanto il caso della \acr{glibc}.} -che consente di gestire in maniera automatica sia la lingua in cui vengono -stampati i vari messaggi (come i messaggi associati agli errori che vedremo in -sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una -serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti -alfabetici, le espressioni della valute, ecc. +% Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente +% \envvar{LANG} sia usata per indicare ai processi il valore della cosiddetta +% \textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie +% di sistema\footnote{prenderemo in esame soltanto il caso della \acr{glibc}.} +% che consente di gestire in maniera automatica sia la lingua in cui vengono +% stampati i vari messaggi (come i messaggi associati agli errori che vedremo in +% sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una +% serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti +% alfabetici, le espressioni della valute, ecc. -Da finire. +% Da finire. % La localizzazione di un programma si può selezionare con la @@ -2327,7 +2331,7 @@ adeguati. L'uso di una \textit{variadic function} prevede quindi tre punti: Lo standard ISO C prevede che una \textit{variadic function} abbia sempre almeno un argomento fisso. Prima di effettuare la dichiarazione deve essere -incluso l'apposito \textit{header file} \file{stdarg.h}; un esempio di +incluso l'apposito \textit{header file} \headfile{stdarg.h}; un esempio di dichiarazione è il prototipo della funzione \func{execl} che vedremo in sez.~\ref{sec:proc_exec}: \includecodesnip{listati/exec_sample.c} @@ -2361,7 +2365,7 @@ pertanto quella sequenziale, in cui vengono estratti dallo \itindex{stack} \textit{stack} secondo l'ordine in cui sono stati scritti nel prototipo della funzione. -Per fare questo in \file{stdarg.h} sono definite delle macro specifiche, +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 una lista degli argomenti, la sua definizione è: diff --git a/prochand.tex b/prochand.tex index 7ac714c..abe6f47 100644 --- a/prochand.tex +++ b/prochand.tex @@ -75,7 +75,7 @@ struttura del sistema comunque consente di lanciare al posto di \cmd{init} qualunque altro programma, e in casi di emergenza (ad esempio se il file di \cmd{init} si fosse corrotto) è ad esempio possibile lanciare una shell al suo posto.\footnote{la cosa si fa passando la riga \cmd{init=/bin/sh} come - parametro di avvio del kernel, l'argomento è di natura amministrativa e + parametro di avvio del kernel, l'argomento è di natura sistemistica e trattato in sez.~5.3 di \cite{AGL}.} \begin{figure}[!htb] @@ -614,8 +614,8 @@ comune dopo l'esecuzione di una \func{fork} è la seguente: \item gli identificatori per il controllo di sessione: il \itindex{process~group} \textit{process group-ID} e il \textit{session id} ed il terminale di controllo (vedi sez.~\ref{sec:sess_proc_group}); -\item la directory di lavoro e la directory radice (vedi - sez.~\ref{sec:file_work_dir} e sez.~\ref{sec:file_chroot}); +\item la \index{directory~di~lavoro} directory di lavoro e la directory radice + (vedi sez.~\ref{sec:file_work_dir} e sez.~\ref{sec:file_chroot}); \item la maschera dei permessi di creazione dei file (vedi sez.~\ref{sec:file_perm_management}); \item la maschera dei segnali bloccati (vedi sez.~\ref{sec:sig_sigmask}) e le @@ -1197,7 +1197,7 @@ da \func{wait} o \func{waitpid}. Si tenga conto che nel caso di conclusione anomala il valore restituito da \val{WTERMSIG} può essere confrontato con le costanti che identificano i -segnali definite in \file{signal.h} ed elencate in +segnali definite in \headfile{signal.h} ed elencate in tab.~\ref{tab:sig_signal_list}, e stampato usando le apposite funzioni trattate in sez.~\ref{sec:sig_strsignal}. @@ -1348,7 +1348,7 @@ La funzione \func{wait4} è identica \func{waitpid} sia nel comportamento che per i valori dei primi tre argomenti, ma in più restituisce nell'argomento aggiuntivo \param{rusage} un sommario delle risorse usate dal processo. Questo argomento è una struttura di tipo \struct{rusage} definita in -\file{sys/resource.h}, che viene utilizzata anche dalla funzione +\headfile{sys/resource.h}, che viene utilizzata anche dalla funzione \func{getrusage} per ottenere le risorse di sistema usate da un processo. La sua definizione è riportata in fig.~\ref{fig:sys_rusage_struct} e ne tratteremo in dettaglio il significato sez.~\ref{sec:sys_resource_use}. La @@ -1514,12 +1514,12 @@ si indicano le due funzioni che replicano il comportamento della shell nello specificare il comando da eseguire; quando l'argomento \param{file} non contiene una ``\texttt{/}'' esso viene considerato come un nome di programma, e viene eseguita automaticamente una ricerca fra i file presenti nella lista -di directory specificate dalla variabile di ambiente \var{PATH}. Il file che -viene posto in esecuzione è il primo che viene trovato. Se si ha un errore +di directory specificate dalla variabile di ambiente \envvar{PATH}. Il file +che viene posto in esecuzione è il primo che viene trovato. Se si ha un errore relativo a permessi di accesso insufficienti (cioè l'esecuzione della sottostante \func{execve} ritorna un \errcode{EACCES}), la ricerca viene -proseguita nelle eventuali ulteriori directory indicate in \var{PATH}; solo se -non viene trovato nessun altro file viene finalmente restituito +proseguita nelle eventuali ulteriori directory indicate in \envvar{PATH}; solo +se non viene trovato nessun altro file viene finalmente restituito \errcode{EACCES}. Le altre quattro funzioni si limitano invece a cercare di eseguire il file indicato dall'argomento \param{path}, che viene interpretato come il \itindex{pathname} \textit{pathname} del programma. @@ -1541,8 +1541,8 @@ seguente: (\ids{PPID}); \item l'\textsl{user-ID reale}, il \textit{group-ID reale} ed i \textsl{group-ID supplementari} (vedi sez.~\ref{sec:proc_access_id}); -\item la directory radice e la directory di lavoro corrente (vedi - sez.~\ref{sec:file_work_dir}); +\item la directory radice e la \index{directory~di~lavoro} directory di lavoro + corrente (vedi sez.~\ref{sec:file_work_dir}); \item la maschera di creazione dei file \itindex{umask} (\textit{umask}, vedi sez.~\ref{sec:file_perm_management}) ed i \textit{lock} sui file (vedi sez.~\ref{sec:file_locking}); @@ -2551,7 +2551,7 @@ La funzione permette, a seconda di quanto specificato nell'argomento \param{which}, di leggere il valore di \textit{nice} di un processo, di un gruppo di processi (vedi sez.~\ref{sec:sess_proc_group}) o di un utente indicato dall'argomento \param{who}. Nelle vecchie versioni può -essere necessario includere anche \code{sys/time.h}, questo non è più +essere necessario includere anche \headfile{sys/time.h}, questo non è più necessario con versioni recenti delle librerie, ma è comunque utile per portabilità. @@ -2934,7 +2934,7 @@ 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} \file{sched.h}. + file} \headfile{sched.h}. Se invece si vuole sapere quale è politica di \textit{scheduling} di un processo si può usare la funzione \funcd{sched\_getscheduler}, il cui @@ -3130,7 +3130,7 @@ forma attuale.\footnote{pertanto se la vostra pagina di manuale non è aggiornata, o usate quella particolare versione delle \acr{glibc}, potrete trovare indicazioni diverse, il prototipo illustrato è quello riportato nella versione corrente (maggio 2008) delle pagine di manuale e - corrispondente alla definizione presente in \file{sched.h}.} + corrispondente alla definizione presente in \headfile{sched.h}.} La funzione imposta, con l'uso del valore contenuto all'indirizzo \param{mask}, l'insieme dei processori sui quali deve essere eseguito il @@ -3759,7 +3759,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. \textit{secure computing mode} il processo potrà utilizzare soltanto un insieme estremamente limitato di \textit{system call}: \func{read}, \func{write}, \func{\_exit} e \func{sigreturn}. Ogni altra \textit{system - call} porterà all'emissione di un \func{SIGKILL} (vedi + call} porterà all'emissione di un \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}). Il \textit{secure computing mode} è stato ideato per fornire un supporto per l'esecuzione di codice esterno non fidato e non verificabile a scopo di calcolo;\footnote{lo scopo è quello di poter @@ -3776,7 +3776,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato che la chiamata di questa funzione in \itindex{secure~computing~mode} \textit{secure computing mode} comporterebbe l'emissione di - \texttt{SIGKILL}, è stata comunque definita per eventuali estensioni future. + \signal{SIGKILL}, è stata comunque definita per eventuali estensioni future. Introdotta a partire dal kernel 2.6.23. \item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits} diff --git a/session.tex b/session.tex index 365749c..ced82eb 100644 --- a/session.tex +++ b/session.tex @@ -143,12 +143,12 @@ processi vengono raggruppati in \textit{process group} e \textsl{sessioni}; per far questo vengono utilizzati due ulteriori identificatori (oltre quelli visti in sez.~\ref{sec:proc_pid}) che il kernel associa a ciascun processo:\footnote{in Linux questi identificatori sono mantenuti nei campi - \var{pgrp} e \var{session} della struttura \struct{task\_struct} definita in - \file{sched.h}.} l'identificatore del \textit{process group} e -l'identificatore della \textsl{sessione}, che vengono indicati rispettivamente -con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in variabili di tipo -\type{pid\_t}. I valori di questi identificatori possono essere visualizzati -dal comando \cmd{ps} usando l'opzione \cmd{-j}. + \var{pgrp} e \var{session} della struttura \kstruct{task\_struct} definita + in \file{include/linux/sched.h}.} l'identificatore del \textit{process + group} e l'identificatore della \textsl{sessione}, che vengono indicati +rispettivamente con le sigle \acr{pgid} e \acr{sid}, e sono mantenuti in +variabili di tipo \type{pid\_t}. I valori di questi identificatori possono +essere visualizzati dal comando \cmd{ps} usando l'opzione \cmd{-j}. Un \textit{process group} è pertanto definito da tutti i processi che hanno lo stesso \acr{pgid}; è possibile leggere il valore di questo identificatore con @@ -573,7 +573,7 @@ Una volta che si sia immesso il nome di login \cmd{getty} esegue direttamente il programma \cmd{login} con una \func{exevle}, passando come argomento la stringa con il nome, ed un ambiente opportunamente costruito che contenga quanto necessario; ad esempio di solito viene opportunamente inizializzata la -variabile di ambiente \texttt{TERM} per identificare il terminale su cui si +variabile di ambiente \envvar{TERM} per identificare il terminale su cui si sta operando, a beneficio dei programmi che verranno lanciati in seguito. A sua volta \cmd{login}, che mantiene i privilegi di amministratore, usa il @@ -589,21 +589,21 @@ certo numero di volte dopo di che \cmd{login} esce ed \cmd{init} provvede a rilanciare un'altra istanza di \cmd{getty}. Se invece la password corrisponde \cmd{login} esegue \func{chdir} per -impostare come directory di lavoro la \textit{home directory} dell'utente, -cambia i diritti di accesso al terminale (con \func{chown} e \func{chmod}) per -assegnarne la titolarità all'utente ed al suo gruppo principale, assegnandogli -al contempo i diritti di lettura e scrittura.\footnote{oggi queste operazioni, - insieme ad altre relative alla contabilità ed alla tracciatura degli - accessi, vengono gestite dalle distribuzioni più recenti in una maniera - generica appoggiandosi a servizi di sistema come \textit{ConsoleKit}, ma il - concetto generale resta sostanzialmente lo stesso.} Inoltre il programma -provvede a costruire gli opportuni valori per le variabili di ambiente, come -\texttt{HOME}, \texttt{SHELL}, ecc. Infine attraverso l'uso di \func{setuid}, -\func{setgid} e \func{initgroups} verrà cambiata l'identità del proprietario -del processo, infatti, come spiegato in sez.~\ref{sec:proc_setuid}, avendo -invocato tali funzioni con i privilegi di amministratore, tutti gli \ids{UID} -ed i \ids{GID} (reali, effettivi e salvati) saranno impostati a quelli -dell'utente. +impostare come \index{directory~di~lavoro} directory di lavoro la \textit{home + directory} dell'utente, cambia i diritti di accesso al terminale (con +\func{chown} e \func{chmod}) per assegnarne la titolarità all'utente ed al suo +gruppo principale, assegnandogli al contempo i diritti di lettura e +scrittura.\footnote{oggi queste operazioni, insieme ad altre relative alla + contabilità ed alla tracciatura degli accessi, vengono gestite dalle + distribuzioni più recenti in una maniera generica appoggiandosi a servizi di + sistema come \textit{ConsoleKit}, ma il concetto generale resta + sostanzialmente lo stesso.} Inoltre il programma provvede a costruire gli +opportuni valori per le variabili di ambiente, come \envvar{HOME}, +\envvar{SHELL}, ecc. Infine attraverso l'uso di \func{setuid}, \func{setgid} +e \func{initgroups} verrà cambiata l'identità del proprietario del processo, +infatti, come spiegato in sez.~\ref{sec:proc_setuid}, avendo invocato tali +funzioni con i privilegi di amministratore, tutti gli \ids{UID} ed i \ids{GID} +(reali, effettivi e salvati) saranno impostati a quelli dell'utente. A questo punto \cmd{login} provvederà (fatte salve eventuali altre azioni iniziali, come la stampa di messaggi di benvenuto o il controllo della posta) @@ -672,11 +672,11 @@ occorrerà predisporlo in modo che esso compia le seguenti azioni: eseguendo una ulteriore \func{fork} uscendo nel padre e proseguendo nel figlio. In questo caso, non essendo più quest'ultimo un leader di sessione non potrà ottenere automaticamente un terminale di controllo. -\item Eseguire una \func{chdir} per impostare la directory di lavoro del - processo (su \file{/} o su una directory che contenga dei file necessari per - il programma), per evitare che la directory da cui si è lanciato il processo - resti in uso e non sia possibile rimuoverla o smontare il filesystem che la - contiene. +\item Eseguire una \func{chdir} per impostare la \index{directory~di~lavoro} + directory di lavoro del processo (su \file{/} o su una directory che + contenga dei file necessari per il programma), per evitare che la directory + da cui si è lanciato il processo resti in uso e non sia possibile rimuoverla + o smontare il filesystem che la contiene. \item Impostare la \itindex{umask} maschera dei permessi (di solito con \code{umask(0)}) in modo da non essere dipendenti dal valore ereditato da chi ha lanciato originariamente il processo. @@ -703,9 +703,10 @@ La funzione esegue una \func{fork}, per uscire subito, con \func{\_exit}, nel padre, mentre l'esecuzione prosegue nel figlio che esegue subito una \func{setsid}. In questo modo si compiono automaticamente i passi 1 e 2 della precedente lista. Se \param{nochdir} è nullo la funzione imposta anche la -directory di lavoro su \file{/}, se \param{noclose} è nullo i file standard -vengono rediretti su \file{/dev/null} (corrispondenti ai passi 4 e 6); in caso -di valori non nulli non viene eseguita nessuna altra azione. +\index{directory~di~lavoro} directory di lavoro su \file{/}, +se \param{noclose} è nullo i file standard vengono rediretti su +\file{/dev/null} (corrispondenti ai passi 4 e 6); in caso di valori non nulli +non viene eseguita nessuna altra azione. Dato che un programma demone non può più accedere al terminale, si pone il problema di come fare per la notifica di eventuali errori, non potendosi più @@ -999,7 +1000,7 @@ sono riportati in fig.~\ref{fig:printk_priority} \normalsize \caption{Definizione delle stringhe coi relativi valori numerici che indicano le priorità dei messaggi del kernel (ripresa da - \texttt{linux/kernel.h}).} + \file{include/linux/kernel.h}).} \label{fig:printk_priority} \end{figure} @@ -1040,7 +1041,7 @@ circolare esiste una apposita \textit{system call} chiamata anch'essa \texttt{syslog}, ma dato il conflitto di nomi questa viene rimappata su un'altra funzione di libreria, in particolare nelle \acr{glibc} essa viene invocata tramite la funzione \funcd{klogctl},\footnote{nelle \acr{libc4} e - nelle \acr{libc5} la funzione invece era \func{SYS\_klog}.} il cui prototipo + nelle \acr{libc5} la funzione invece era \code{SYS\_klog}.} il cui prototipo è: \begin{prototype}{sys/klog.h}{int klogctl(int op, char *buffer, int len)} diff --git a/signal.tex b/signal.tex index ef80f95..456c4a2 100644 --- a/signal.tex +++ b/signal.tex @@ -282,12 +282,12 @@ di identificarli, e le funzioni che ne stampano la descrizione. Ciascun segnale è identificato rispetto al sistema da un numero, ma l'uso diretto di questo numero da parte dei programmi è da evitare, in quanto esso può variare a seconda dell'implementazione del sistema, e nel caso di Linux, -anche a seconda dell'architettura hardware. -Per questo motivo ad ogni segnale viene associato un nome, definendo con una -macro di preprocessore una costante uguale al suddetto numero. Sono questi -nomi, che sono standardizzati e sostanzialmente uniformi rispetto alle varie -implementazioni, che si devono usare nei programmi. Tutti i nomi e le funzioni -che concernono i segnali sono definiti nell'header di sistema \file{signal.h}. +anche a seconda dell'architettura hardware. Per questo motivo ad ogni segnale +viene associato un nome, definendo con una macro di preprocessore una costante +uguale al suddetto numero. Sono questi nomi, che sono standardizzati e +sostanzialmente uniformi rispetto alle varie implementazioni, che si devono +usare nei programmi. Tutti i nomi e le funzioni che concernono i segnali sono +definiti nell'header di sistema \headfile{signal.h}. Il numero totale di segnali presenti è dato dalla macro \const{NSIG}, e dato che i numeri dei segnali sono allocati progressivamente, essa corrisponde @@ -447,7 +447,7 @@ programma al momento della terminazione. Questi segnali sono: segnale può condurre ad un ciclo infinito. % Per questo segnale le cose sono complicate dal fatto che possono esserci -% molte diverse eccezioni che \texttt{SIGFPE} non distingue, mentre lo +% molte diverse eccezioni che \signal{SIGFPE} non distingue, mentre lo % standard IEEE per le operazioni in virgola mobile definisce varie eccezioni % aritmetiche e richiede che esse siano notificate. % TODO trovare altre info su SIGFPE e trattare la notifica delle eccezioni @@ -751,8 +751,8 @@ La seconda funzione, \funcd{psignal}, deriva da BSD ed è analoga alla funzione Una modalità alternativa per utilizzare le descrizioni restituite da \func{strsignal} e \func{psignal} è quello di usare la variabile -\var{sys\_siglist}, che è definita in \file{signal.h} e può essere acceduta -con la dichiarazione: +\var{sys\_siglist}, che è definita in \headfile{signal.h} e può essere +acceduta con la dichiarazione: \includecodesnip{listati/siglist.c} L'array \var{sys\_siglist} contiene i puntatori alle stringhe di descrizione, @@ -938,7 +938,7 @@ primi Unix in cui il gestore viene disinstallato alla sua chiamata, secondo la semantica inaffidabile; anche Linux seguiva questa convenzione con le vecchie librerie del C come le \acr{libc4} e le \acr{libc5}.\footnote{nelle \acr{libc5} esiste però la possibilità di includere \file{bsd/signal.h} al - posto di \file{signal.h}, nel qual caso la funzione \func{signal} viene + posto di \headfile{signal.h}, nel qual caso la funzione \func{signal} viene ridefinita per seguire la semantica affidabile usata da BSD.} Al contrario BSD segue la semantica affidabile, non disinstallando il gestore @@ -2708,16 +2708,16 @@ tab.~\ref{tab:sig_timer_clockid_types}. Per poter utilizzare queste funzionalità le \acr{glibc} richiedono che la macro \macro{\_POSIX\_C\_SOURCE} sia definita ad un valore maggiore o uguale di \texttt{199309L} (vedi sez.~\ref{sec:intro_gcc_glibc_std}), inoltre i -programmi che le usano devono essere collegati con la libreria delle estensioni -\textit{real-time} usando esplicitamente l'opzione \texttt{-lrt}. Si tenga -presente inoltre che la disponibilità di queste funzionalità avanzate può -essere controllato dalla definizione della macro \macro{\_POSIX\_TIMERS} ad un -valore maggiore di 0, e che le ulteriori macro +programmi che le usano devono essere collegati con la libreria delle +estensioni \textit{real-time} usando esplicitamente l'opzione +\texttt{-lrt}. Si tenga presente inoltre che la disponibilità di queste +funzionalità avanzate può essere controllato dalla definizione della macro +\macro{\_POSIX\_TIMERS} ad un valore maggiore di 0, e che le ulteriori macro \macro{\_POSIX\_MONOTONIC\_CLOCK}, \macro{\_POSIX\_CPUTIME} e \macro{\_POSIX\_THREAD\_CPUTIME} indicano la presenza dei rispettivi orologi di tipo \const{CLOCK\_MONOTONIC}, \const{CLOCK\_PROCESS\_CPUTIME\_ID} e \const{CLOCK\_PROCESS\_CPUTIME\_ID}.\footnote{tutte queste macro sono definite - in \texttt{unistd.h}, che pertanto deve essere incluso per poterle + in \headfile{unistd.h}, che pertanto deve essere incluso per poterle controllarle.} Infine se il kernel ha il supporto per gli \textit{high resolution timer} un elenco degli orologi e dei timer può essere ottenuto tramite il file \procfile{/proc/timer\_list}. @@ -2947,14 +2947,14 @@ meccanismo di notifica. \label{fig:struct_sigevent} \end{figure} -La struttura \struct{sigevent} (accessibile includendo \texttt{time.h}) è +La struttura \struct{sigevent} (accessibile includendo \headfile{time.h}) è riportata in fig.~\ref{fig:struct_sigevent};\footnote{la definizione effettiva dipende dall'implementazione, quella mostrata è la versione descritta nella - pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è il -più importante essendo quello che indica le modalità della notifica, gli altri -dipendono dal valore che si è specificato per \var{sigev\_notify}, si sono -riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del meccanismo di -notifica viene fatta impostando uno dei valori di + pagina di manuale di \func{timer\_create}.} il campo \var{sigev\_notify} è +il più importante essendo quello che indica le modalità della notifica, gli +altri dipendono dal valore che si è specificato per \var{sigev\_notify}, si +sono riportati in tab.~\ref{tab:sigevent_sigev_notify}. La scelta del +meccanismo di notifica viene fatta impostando uno dei valori di tab.~\ref{tab:sigevent_sigev_notify} per \var{sigev\_notify}, e fornendo gli eventuali ulteriori argomenti necessari a secondo della scelta effettuata. Diventa così possibile indicare l'uso di un segnale o l'esecuzione @@ -3262,7 +3262,7 @@ procedura: \end{enumerate*} In genere il primo passo viene effettuato allocando un'opportuna area di -memoria con \code{malloc}; in \file{signal.h} sono definite due costanti, +memoria con \code{malloc}; in \headfile{signal.h} sono definite due costanti, \const{SIGSTKSZ} e \const{MINSIGSTKSZ}, che possono essere utilizzate per allocare una quantità di spazio opportuna, in modo da evitare overflow. La prima delle due è la dimensione canonica per uno \itindex{stack} diff --git a/sockctrl.tex b/sockctrl.tex index 0601ad8..3a2afa7 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -269,16 +269,16 @@ gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non sono specificati server verrà utilizzato l'indirizzo locale, e se non è definito un dominio di default sarà usato quello associato con l'indirizzo locale (ma questo può essere sovrascritto con l'uso della variabile di -ambiente \texttt{LOCALDOMAIN}). In genere non è necessario eseguire questa +ambiente \envvar{LOCALDOMAIN}). In genere non è necessario eseguire questa funzione direttamente in quanto viene automaticamente chiamata la prima volta che si esegue una delle altre. Le impostazioni e lo stato del \textit{resolver} vengono mantenuti in una serie di variabili raggruppate nei campi di una apposita struttura \var{\_res} -usata da tutte queste funzioni. Essa viene definita in \file{resolv.h} ed è -utilizzata internamente alle funzioni essendo definita come variabile globale; -questo consente anche di accedervi direttamente all'interno di un qualunque -programma, una volta che la sia opportunamente dichiarata come: +usata da tutte queste funzioni. Essa viene definita in \headfile{resolv.h} ed +è utilizzata internamente alle funzioni essendo definita come variabile +globale; questo consente anche di accedervi direttamente all'interno di un +qualunque programma, una volta che la sia opportunamente dichiarata come: \includecodesnip{listati/resolv_option.c} Tutti i campi della struttura sono ad uso interno, e vengono usualmente @@ -320,7 +320,7 @@ comportamento del \textit{resolver}. \const{RES\_INSECURE1} & Blocca i controlli di sicurezza di tipo 1.\\ \const{RES\_INSECURE2} & Blocca i controlli di sicurezza di tipo 2.\\ \const{RES\_NOALIASES} & Blocca l'uso della variabile di ambiente - \texttt{HOSTALIASES}.\\ + \envvar{HOSTALIASES}.\\ \const{RES\_USE\_INET6} & Restituisce indirizzi IPv6 con \func{gethostbyname}. \\ \const{RES\_ROTATE} & Ruota la lista dei server DNS dopo ogni @@ -354,22 +354,23 @@ Non tratteremo il significato degli altri campi non essendovi necessità di modificarli direttamente; gran parte di essi sono infatti impostati dal contenuto dei file di configurazione, mentre le funzionalità controllate da alcuni di esse possono essere modificate con l'uso delle opportune variabili -di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con -\texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che +di ambiente come abbiamo visto per \envvar{LOCALDOMAIN}. In particolare con +\envvar{RES\_RETRY} si soprassiede il valore del campo \var{retry} che controlla quante volte viene ripetuto il tentativo di connettersi ad un server DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo -significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si +significa bloccare l'uso del DNS. Infine con \envvar{RES\_TIMEOUT} si soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore - della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il -valore preso come base (in numero di secondi) per definire la scadenza di una -richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppiando -il tempo di scadenza per il numero massimo di volte stabilito da + della omonima costante \const{RES\_TIMEOUT} di \headfile{resolv.h}.} che è +il valore preso come base (in numero di secondi) per definire la scadenza di +una richiesta, ciascun tentativo di richiesta fallito viene ripetuto +raddoppiando il tempo di scadenza per il numero massimo di volte stabilito da \texttt{RES\_RETRY}. La funzione di interrogazione principale è \funcd{res\_query}, che serve ad eseguire una richiesta ad un server DNS per un nome a dominio -\textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully - Qualified Domain Name}); il suo prototipo è: +\textsl{completamente specificato} (quello che si chiama +\itindex{Fully~Qualified~Domain~Name~(FQDN)} FQDN, \textit{Fully Qualified + Domain Name}); il suo prototipo è: \begin{functions} \headdecl{netinet/in.h} @@ -453,19 +454,19 @@ tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe Come accennato le tipologie di dati che sono mantenibili su un server DNS sono diverse, ed a ciascuna di essa corrisponde un diverso tipo di \textit{resource record}. L'elenco delle costanti\footnote{ripreso dai file di dichiarazione - \file{arpa/nameser.h} e \file{arpa/nameser\_compat.h}.} che definiscono i -valori che si possono usare per l'argomento \param{type} per specificare il -tipo di \textit{resource record} da richiedere è riportato in + \headfile{arpa/nameser.h} e \headfile{arpa/nameser\_compat.h}.} che +definiscono i valori che si possono usare per l'argomento \param{type} per +specificare il tipo di \textit{resource record} da richiedere è riportato in tab.~\ref{tab:DNS_record_type}; le costanti (tolto il \texttt{T\_} iniziale) hanno gli stessi nomi usati per identificare i record nei file di zona di BIND,\footnote{BIND, acronimo di \textit{Berkley Internet Name Domain}, è una implementazione di un server DNS, ed, essendo utilizzata nella stragrande - maggioranza dei casi, fa da riferimento; i dati relativi ad un certo - dominio (cioè i suoi \textit{resource record} vengono mantenuti in quelli - che sono usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo - di dominio è identificato da un nome che è appunto identico a quello delle - costanti di tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} -e che normalmente sono anche usati come nomi per indicare i record. + maggioranza dei casi, fa da riferimento; i dati relativi ad un certo dominio + (cioè i suoi \textit{resource record} vengono mantenuti in quelli che sono + usualmente chiamati \textsl{file di zona}, e in essi ciascun tipo di dominio + è identificato da un nome che è appunto identico a quello delle costanti di + tab.~\ref{tab:DNS_record_type} senza il \texttt{T\_} iniziale.} e che +normalmente sono anche usati come nomi per indicare i record. \begin{table}[!htb] \centering @@ -710,7 +711,7 @@ Determina l'indirizzo di tipo \param{af} associato al nome a dominio In questo caso la funzione prende un secondo argomento \param{af} che indica (i soli valori consentiti sono \const{AF\_INET} o \const{AF\_INET6}, per -questo è necessario l'uso di \texttt{sys/socket.h}) la famiglia di indirizzi +questo è necessario l'uso di \headfile{sys/socket.h}) la famiglia di indirizzi che dovrà essere utilizzata nei risultati restituiti dalla funzione. Per tutto il resto la funzione è identica a \func{gethostbyname}, ed identici sono i suoi risultati. @@ -1281,7 +1282,7 @@ tipo \struct{addrinfo} contenenti tutte le informazioni ottenute. \end{figure} Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la - definizione è ripresa direttamente dal file \texttt{netdb.h} in questa + definizione è ripresa direttamente dal file \headfile{netdb.h} in questa struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi @@ -1671,10 +1672,10 @@ terminate dal carattere NUL, a meno che queste non debbano essere troncate qualora la loro dimensione ecceda quelle specificate dagli argomenti \param{hostlen} e \param{servlen}. Sono comunque definite le due costanti \const{NI\_MAXHOST} e \const{NI\_MAXSERV}\footnote{in Linux le due costanti - sono definite in \file{netdb.h} ed hanno rispettivamente il valore 1024 e - 12.} che possono essere utilizzate come limiti massimi. In caso di errore -viene restituito invece un codice che assume gli stessi valori illustrati in -tab.~\ref{tab:addrinfo_error_code}. + sono definite in \headfile{netdb.h} ed hanno rispettivamente il valore 1024 + e 12.} che possono essere utilizzate come limiti massimi. In caso di +errore viene restituito invece un codice che assume gli stessi valori +illustrati in tab.~\ref{tab:addrinfo_error_code}. A questo punto possiamo fornire degli esempi di utilizzo della nuova interfaccia, adottandola per le precedenti implementazioni del client e del @@ -2287,7 +2288,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e modifica il comportamento delle funzioni \func{close} e \func{shutdown}. L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo - \struct{linger}, definita in \texttt{sys/socket.h} ed illustrata in + \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. @@ -2736,7 +2737,8 @@ socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{IPPROTO\_IP}); si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate -sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file. +sono definite in \headfile{netinet/ip.h}, ed accessibili includendo detto +file. \begin{table}[!htb] \centering @@ -3102,10 +3104,11 @@ riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcplevel}, dove sono elencate le rispettive costanti da utilizzare come valore per l'argomento \param{optname}. Dette costanti e tutte le altre costanti e strutture collegate all'uso delle opzioni TCP sono definite in -\file{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in realtà - questo è il file usato dalle librerie; la definizione delle opzioni - effettivamente supportate da Linux si trova nel file \texttt{linux/tcp.h}, - dal quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.} +\headfile{netinet/tcp.h}, ed accessibili includendo detto file.\footnote{in + realtà questo è il file usato dalle librerie; la definizione delle opzioni + effettivamente supportate da Linux si trova nel file + \texttt{include/linux/tcp.h} dei sorgenti del kernel, dal quale si sono + estratte le costanti di tab.~\ref{tab:sock_opt_tcplevel}.} \begin{table}[!htb] \centering @@ -3482,10 +3485,11 @@ ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udplevel}; anche in questo caso per poterle utilizzare occorrerà impostare l'opportuno valore per l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente \const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono -definite in \file{netinet/udp.h}, ed accessibili includendo detto +definite in \headfile{netinet/udp.h}, ed accessibili includendo detto file.\footnote{come per TCP, la definizione delle opzioni effettivamente - supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal - quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.} + supportate dal kernel si trova in realtà nel file + \texttt{include/linux/udp.h}, dal quale si sono estratte le costanti di + tab.~\ref{tab:sock_opt_udplevel}.} \begin{table}[!htb] \centering diff --git a/socket.tex b/socket.tex index dfcfd32..58a18a5 100644 --- a/socket.tex +++ b/socket.tex @@ -238,8 +238,8 @@ valori numerici.\footnote{in Linux, come si può verificare andando a guardare lo stesso nome.} I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di -indirizzi, sono definiti dall'header \texttt{socket.h}. Un elenco delle -famiglie di protocolli disponibili in Linux è riportato in +indirizzi, sono definiti dall'\textit{header file} \headfile{socket.h}. Un +elenco delle famiglie di protocolli disponibili in Linux è riportato in tab.~\ref{tab:net_pf_names}.\footnote{l'elenco indica tutti i protocolli definiti; fra questi però saranno utilizzabili solo quelli per i quali si è compilato il supporto nel kernel (o si sono caricati gli opportuni moduli), @@ -394,7 +394,7 @@ occorrerà eseguire una conversione del relativo puntatore. I tipi di dati che compongono la struttura sono stabiliti dallo standard POSIX.1g e li abbiamo riassunti in tab.~\ref{tab:sock_data_types} con i rispettivi file di include in cui sono definiti; la struttura è invece -definita nell'include file \file{sys/socket.h}. +definita nell'include file \headfile{sys/socket.h}. \begin{table}[!htb] \centering @@ -406,21 +406,21 @@ definita nell'include file \file{sys/socket.h}. \multicolumn{1}{|c|}{\textbf{Header}} \\ \hline \hline - \type{int8\_t} & intero a 8 bit con segno & \file{sys/types.h}\\ - \type{uint8\_t} & intero a 8 bit senza segno & \file{sys/types.h}\\ - \type{int16\_t} & intero a 16 bit con segno & \file{sys/types.h}\\ - \type{uint16\_t} & intero a 16 bit senza segno& \file{sys/types.h}\\ - \type{int32\_t} & intero a 32 bit con segno & \file{sys/types.h}\\ - \type{uint32\_t} & intero a 32 bit senza segno& \file{sys/types.h}\\ + \type{int8\_t} & intero a 8 bit con segno & \headfile{sys/types.h}\\ + \type{uint8\_t} & intero a 8 bit senza segno & \headfile{sys/types.h}\\ + \type{int16\_t} & intero a 16 bit con segno & \headfile{sys/types.h}\\ + \type{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\ + \type{int32\_t} & intero a 32 bit con segno & \headfile{sys/types.h}\\ + \type{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\ \hline - \type{sa\_family\_t} & famiglia degli indirizzi& \file{sys/socket.h}\\ + \type{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\ \type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di - un socket& \file{sys/socket.h}\\ + un socket& \headfile{sys/socket.h}\\ \hline \type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) & - \file{netinet/in.h}\\ + \headfile{netinet/in.h}\\ \type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})& - \file{netinet/in.h}\\ + \headfile{netinet/in.h}\\ \hline \end{tabular} \caption{Tipi di dati usati nelle strutture degli indirizzi, secondo quanto @@ -449,7 +449,7 @@ sarebbe più immediato per l'utente (che non dovrebbe più eseguire il casting), I socket di tipo \const{PF\_INET} vengono usati per la comunicazione attraverso internet; la struttura per gli indirizzi per un socket internet (se si usa IPv4) è definita come \struct{sockaddr\_in} nell'header file -\file{netinet/in.h} ed ha la forma mostrata in +\headfile{netinet/in.h} ed ha la forma mostrata in fig.~\ref{fig:sock_sa_ipv4_struct}, conforme allo standard POSIX.1g. \begin{figure}[!htb] @@ -482,8 +482,8 @@ vedremo in 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 -direttamente come intero. In \file{netinet/in.h} vengono definite anche alcune -costanti che identificano alcuni indirizzi speciali, riportati in +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. Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono @@ -501,8 +501,8 @@ soluzioni). Essendo IPv6 un'estensione di IPv4, i socket di tipo \const{PF\_INET6} sono sostanzialmente identici ai precedenti; la parte in cui si trovano praticamente tutte le differenze fra i due socket è quella della struttura -degli indirizzi; la sua definizione, presa da \file{netinet/in.h}, è riportata -in fig.~\ref{fig:sock_sa_ipv6_struct}. +degli indirizzi; la sua definizione, presa da \headfile{netinet/in.h}, è +riportata in fig.~\ref{fig:sock_sa_ipv6_struct}. \begin{figure}[!htb] \footnotesize \centering @@ -551,7 +551,8 @@ fig.~\ref{fig:sock_sa_local_struct}. \includestruct{listati/sockaddr_un.h} \end{minipage} \caption{La struttura \structd{sockaddr\_un} degli indirizzi dei socket - locali (detti anche \textit{unix domain}) definita in \file{sys/un.h}.} + locali (detti anche \textit{unix domain}) definita in + \headfile{sys/un.h}.} \label{fig:sock_sa_local_struct} \end{figure} @@ -586,7 +587,7 @@ per \param{protocol} è \const{ATPROTO\_DDP}. Gli indirizzi AppleTalk devono essere specificati tramite una struttura \struct{sockaddr\_atalk}, la cui definizione è riportata in fig.~\ref{fig:sock_sa_atalk_struct}; la struttura viene dichiarata includendo -il file \file{netatalk/at.h}. +il file \headfile{netatalk/at.h}. \begin{figure}[!htb] \footnotesize \centering diff --git a/system.tex b/system.tex index 1b4a1b0..77a866a 100644 --- a/system.tex +++ b/system.tex @@ -65,20 +65,20 @@ sono fissi in un'implementazione mentre possono variare in un altra. Tutto questo crea una ambiguità che non è sempre possibile risolvere in maniera chiara; in generale quello che succede è che quando i limiti del sistema sono fissi essi vengono definiti come macro di preprocessore nel file -\file{limits.h}, se invece possono variare, il loro valore sarà ottenibile +\headfile{limits.h}, se invece possono variare, il loro valore sarà ottenibile tramite la funzione \func{sysconf} (che esamineremo in sez.~\ref{sec:sys_sysconf}). Lo standard ANSI C definisce dei limiti che sono tutti fissi, pertanto questo saranno sempre disponibili al momento della compilazione. Un elenco, ripreso -da \file{limits.h}, è riportato in tab.~\ref{tab:sys_ansic_macro}. Come si può -vedere per la maggior parte questi limiti attengono alle dimensioni dei dati -interi, che sono in genere fissati dall'architettura hardware (le analoghe -informazioni per i dati in virgola mobile sono definite a parte, ed -accessibili includendo \file{float.h}). Lo standard prevede anche un'altra +da \headfile{limits.h}, è riportato in tab.~\ref{tab:sys_ansic_macro}. Come si +può vedere per la maggior parte questi limiti attengono alle dimensioni dei +dati interi, che sono in genere fissati dall'architettura hardware (le +analoghe informazioni per i dati in virgola mobile sono definite a parte, ed +accessibili includendo \headfile{float.h}). Lo standard prevede anche un'altra costante, \const{FOPEN\_MAX}, che può non essere fissa e che pertanto non è -definita in \file{limits.h}; essa deve essere definita in \file{stdio.h} ed -avere un valore minimo di 8. +definita in \headfile{limits.h}; essa deve essere definita in +\headfile{stdio.h} ed avere un valore minimo di 8. \begin{table}[htb] \centering @@ -107,7 +107,7 @@ avere un valore minimo di 8. \const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\ \hline \end{tabular} - \caption{Costanti definite in \file{limits.h} in conformità allo standard + \caption{Costanti definite in \headfile{limits.h} in conformità allo standard ANSI C.} \label{tab:sys_ansic_macro} \end{table} @@ -136,7 +136,7 @@ tab.~\ref{tab:sys_isoc90_macro}. Massimo di \ctyp{unsigned long long}.\\ \hline \end{tabular} - \caption{Macro definite in \file{limits.h} in conformità allo standard + \caption{Macro definite in \headfile{limits.h} in conformità allo standard ISO C90.} \label{tab:sys_isoc90_macro} \end{table} @@ -184,13 +184,14 @@ file, riportate in tab.~\ref{tab:sys_file_macro}). \label{tab:sys_generic_macro} \end{table} -Lo standard dice che queste macro devono essere definite in \file{limits.h} -quando i valori a cui fanno riferimento sono fissi, e altrimenti devono essere -lasciate indefinite, ed i loro valori dei limiti devono essere accessibili -solo attraverso \func{sysconf}. In realtà queste vengono sempre definite ad -un valore generico. Si tenga presente poi che alcuni di questi limiti possono -assumere valori molto elevati (come \const{CHILD\_MAX}), e non è pertanto il -caso di utilizzarli per allocare staticamente della memoria. +Lo standard dice che queste macro devono essere definite in +\headfile{limits.h} quando i valori a cui fanno riferimento sono fissi, e +altrimenti devono essere lasciate indefinite, ed i loro valori dei limiti +devono essere accessibili solo attraverso \func{sysconf}. In realtà queste +vengono sempre definite ad un valore generico. Si tenga presente poi che +alcuni di questi limiti possono assumere valori molto elevati (come +\const{CHILD\_MAX}), e non è pertanto il caso di utilizzarli per allocare +staticamente della memoria. A complicare la faccenda si aggiunge il fatto che POSIX.1 prevede una serie di altre costanti (il cui nome inizia sempre con \code{\_POSIX\_}) che @@ -260,8 +261,8 @@ valori ottenuti da \func{sysconf}. 199009L).\\ \hline \end{tabular} - \caption{Alcune macro definite in \file{limits.h} in conformità allo standard - POSIX.1.} + \caption{Alcune macro definite in \headfile{limits.h} in conformità allo + standard POSIX.1.} \label{tab:sys_posix1_other} \end{table} @@ -269,7 +270,7 @@ Oltre ai precedenti valori (e a quelli relativi ai file elencati in tab.~\ref{tab:sys_posix1_file}), che devono essere obbligatoriamente definiti, lo standard POSIX.1 ne prevede parecchi altri. La lista completa si trova dall'header file \file{bits/posix1\_lim.h} (da non usare mai direttamente, è -incluso automaticamente all'interno di \file{limits.h}). Di questi vale la +incluso automaticamente all'interno di \headfile{limits.h}). Di questi vale la pena menzionare alcune macro di uso comune, (riportate in tab.~\ref{tab:sys_posix1_other}), che non indicano un valore specifico, ma denotano la presenza di alcune funzionalità nel sistema (come il supporto del @@ -452,9 +453,9 @@ le analoghe di tab.~\ref{tab:sys_posix1_general}. \label{tab:sys_posix1_file} \end{table} -Tutti questi limiti sono definiti in \file{limits.h}; come nel caso precedente -il loro uso è di scarsa utilità in quanto ampiamente superati in tutte le -implementazioni moderne. +Tutti questi limiti sono definiti in \headfile{limits.h}; come nel caso +precedente il loro uso è di scarsa utilità in quanto ampiamente superati in +tutte le implementazioni moderne. \subsection{La funzione \func{pathconf}} @@ -503,7 +504,7 @@ il suo prototipo è: La funzione, che viene usata dal comando \cmd{uname}, restituisce le informazioni richieste nella struttura \param{info}; anche questa struttura è -definita in \file{sys/utsname.h}, secondo quanto mostrato in +definita in \headfile{sys/utsname.h}, secondo quanto mostrato in fig.~\ref{fig:sys_utsname}, e le informazioni memorizzate nei suoi membri indicano rispettivamente: \begin{itemize*} @@ -597,9 +598,9 @@ Legge o scrive uno dei parametri di sistema. I parametri a cui la funzione permettere di accedere sono organizzati in maniera gerarchica all'interno di un albero;\footnote{si tenga presente che - includendo solo \file{unistd.h}, saranno definiti solo i parametri generici; - dato che ce ne sono molti specifici dell'implementazione, nel caso di Linux - occorrerà includere anche i file \file{linux/unistd.h} e + includendo solo \headfile{unistd.h}, saranno definiti solo i parametri + generici; dato che ce ne sono molti specifici dell'implementazione, nel caso + di Linux occorrerà includere anche i file \file{linux/unistd.h} e \file{linux/sysctl.h}.} per accedere ad uno di essi occorre specificare un cammino attraverso i vari nodi dell'albero, in maniera analoga a come avviene per la risoluzione di un \itindex{pathname} \textit{pathname} (da cui l'uso @@ -623,8 +624,8 @@ Si può effettuare anche una lettura e scrittura simultanea, nel qual caso il valore letto restituito dalla funzione è quello precedente alla scrittura. I parametri accessibili attraverso questa funzione sono moltissimi, e possono -essere trovati in \file{sysctl.h}, essi inoltre dipendono anche dallo stato -corrente del kernel (ad esempio dai moduli che sono stati caricati nel +essere trovati in \headfile{sysctl.h}, essi inoltre dipendono anche dallo +stato corrente del kernel (ad esempio dai moduli che sono stati caricati nel sistema) e in genere i loro nomi possono variare da una versione di kernel all'altra; per questo è sempre il caso di evitare l'uso di \func{sysctl} quando esistono modalità alternative per ottenere le stesse informazioni. @@ -754,9 +755,9 @@ Le due funzioni forniscono le informazioni memorizzate nel registro degli utenti (che nelle versioni più recenti possono essere ottenute attraverso PAM) relative all'utente specificato attraverso il suo \ids{UID} o il nome di login. Entrambe le funzioni restituiscono un puntatore ad una struttura di -tipo \struct{passwd} la cui definizione (anch'essa eseguita in \file{pwd.h}) è -riportata in fig.~\ref{fig:sys_passwd_struct}, dove è pure brevemente -illustrato il significato dei vari campi. +tipo \struct{passwd} la cui definizione (anch'essa eseguita in +\headfile{pwd.h}) è riportata in fig.~\ref{fig:sys_passwd_struct}, dove è pure +brevemente illustrato il significato dei vari campi. \begin{figure}[!htb] \footnotesize @@ -973,10 +974,10 @@ un nome di file sbagliato con \func{utmpname}). Nel caso non si sia utilizzata \func{utmpname} per specificare un file di registro alternativo, sia \func{setutent} che \func{endutent} operano usando -il default che è \file{/var/run/utmp}. Il nome di questo file, così come una -serie di altri valori di default per i \textit{pathname} di uso più comune, -viene mantenuto nei valori di una serie di costanti definite includendo -\file{paths.h}, in particolare quelle che ci interessano sono: +il default che è \sysfile{/var/run/utmp}. Il nome di questo file, così come +una serie di altri valori di default per i \textit{pathname} di uso più +comune, viene mantenuto nei valori di una serie di costanti definite +includendo \headfile{paths.h}, in particolare quelle che ci interessano sono: \begin{basedescript}{\desclabelwidth{2.0cm}} \item[\const{\_PATH\_UTMP}] specifica il file che contiene il registro per gli utenti correntemente collegati; questo è il valore che viene usato se non si @@ -985,7 +986,7 @@ viene mantenuto nei valori di una serie di costanti definite includendo l'archivio storico degli utenti collegati. \end{basedescript} che nel caso di Linux hanno un valore corrispondente ai file -\file{/var/run/utmp} e \file{/var/log/wtmp} citati in precedenza. +\sysfile{/var/run/utmp} e \sysfile{/var/log/wtmp} citati in precedenza. Una volta aperto il file del registro degli utenti si può eseguire una scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent}, @@ -1136,7 +1137,7 @@ utilizzo. Come abbiamo accennato in sez.~\ref{sec:proc_wait} le informazioni riguardo l'utilizzo delle risorse da parte di un processo è mantenuto in una struttura di tipo \struct{rusage}, la cui definizione (che si trova in -\file{sys/resource.h}) è riportata in fig.~\ref{fig:sys_rusage_struct}. +\headfile{sys/resource.h}) è riportata in fig.~\ref{fig:sys_rusage_struct}. \begin{figure}[!htb] \footnotesize @@ -1534,12 +1535,12 @@ prototipo è: \bodydesc{La funzione ritorna 0 in caso di successo o $-1$ in caso di errore, nel qual caso \var{errno} assumerà uno dei valori: \begin{errlist} - \item[\errcode{EACCESS}] non si hanno i permessi per accedere a + \item[\errcode{EACCES}] non si hanno i permessi per accedere a \param{pathname}. \item[\errcode{EPERM}] il processo non ha privilegi sufficienti ad abilitare il \textit{BSD accounting}. \item[\errcode{ENOSYS}] il kernel non supporta il \textit{BSD accounting}. - \item[\errcode{EUSER}] non sono disponibili nel kernel strutture per il + \item[\errcode{EUSERS}] non sono disponibili nel kernel strutture per il file o si è finita la memoria. \end{errlist} ed inoltre \errval{EFAULT}, \errval{EIO}, \errval{ELOOP}, @@ -1613,7 +1614,7 @@ rispettivamente chiamati \itindex{calendar~time} \textit{calendar time} e \type{clock\_t}, che ha quindi una risoluzione del microsecondo. Il numero di \itindex{clock~tick} \textit{tick} al secondo può essere ricavato anche attraverso \func{sysconf} (vedi sez.~\ref{sec:sys_sysconf}). Il vecchio - simbolo \const{CLK\_TCK} definito in \file{time.h} è ormai considerato + simbolo \const{CLK\_TCK} definito in \headfile{time.h} è ormai considerato obsoleto. \end{basedescript} @@ -1881,9 +1882,9 @@ prototipo è: \end{prototype} La funzione richiede una struttura di tipo \struct{timex}, la cui definizione, -così come effettuata in \file{sys/timex.h}, è riportata in -fig.~\ref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore del -campo \var{mode}, che specifica quale parametro dell'orologio di sistema, +così come effettuata in \headfile{sys/timex.h}, è riportata in +fig.~\ref{fig:sys_timex_struct}. L'azione della funzione dipende dal valore +del campo \var{mode}, che specifica quale parametro dell'orologio di sistema, specificato in un opportuno campo di \struct{timex}, deve essere impostato. Un valore nullo serve per leggere i parametri correnti; i valori diversi da zero devono essere specificati come OR binario delle costanti riportate in @@ -2080,9 +2081,9 @@ permette di tenere conto anche della differenza fra tempo universale e ora locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre \index{variabili!globali} variabili globali mostrate in fig.~\ref{fig:sys_tzname}, cui si accede quando si include -\file{time.h}. Queste variabili vengono impostate quando si chiama una delle -precedenti funzioni di conversione, oppure invocando direttamente la funzione -\funcd{tzset}, il cui prototipo è: +\headfile{time.h}. Queste variabili vengono impostate quando si chiama una +delle precedenti funzioni di conversione, oppure invocando direttamente la +funzione \funcd{tzset}, il cui prototipo è: \begin{prototype}{sys/timex.h} {void tzset(void)} @@ -2091,9 +2092,9 @@ precedenti funzioni di conversione, oppure invocando direttamente la funzione \bodydesc{La funzione non ritorna niente e non dà errori.} \end{prototype} -La funzione inizializza le variabili di fig.~\ref{fig:sys_tzname} a partire dal -valore della variabile di ambiente \const{TZ}, se quest'ultima non è definita -verrà usato il file \conffile{/etc/localtime}. +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}. \begin{figure}[!htb] \footnotesize @@ -2224,8 +2225,8 @@ variabile globale \var{errno},\footnote{l'uso di una variabile globale può \textit{thread}) ma lo standard ISO C consente anche di definire \var{errno} come un \textit{modifiable lvalue}, quindi si può anche usare una macro, e questo è infatti il modo usato da Linux per renderla locale ai singoli - \itindex{thread} \textit{thread}.} definita nell'header \file{errno.h}; la -variabile è in genere definita come \direct{volatile} dato che può essere + \itindex{thread} \textit{thread}.} definita nell'header \headfile{errno.h}; +la variabile è in genere definita come \direct{volatile} dato che può essere cambiata in modo asincrono da un segnale (si veda sez.~\ref{sec:sig_sigchld} per un esempio, ricordando quanto trattato in sez.~\ref{sec:proc_race_cond}), ma dato che un gestore di segnale scritto bene salva e ripristina il valore @@ -2233,12 +2234,12 @@ della variabile, di questo non è necessario preoccuparsi nella programmazione normale. I valori che può assumere \var{errno} sono riportati in app.~\ref{cha:errors}, -nell'header \file{errno.h} sono anche definiti i nomi simbolici per le +nell'header \headfile{errno.h} sono anche definiti i nomi simbolici per le costanti numeriche che identificano i vari errori; essi iniziano tutti per -\val{E} e si possono considerare come nomi riservati. In seguito faremo -sempre riferimento a tali valori, quando descriveremo i possibili errori -restituiti dalle funzioni. Il programma di esempio \cmd{errcode} stampa il -codice relativo ad un valore numerico con l'opzione \cmd{-l}. +\val{E} e si possono considerare come nomi riservati. In seguito faremo sempre +riferimento a tali valori, quando descriveremo i possibili errori restituiti +dalle funzioni. Il programma di esempio \cmd{errcode} stampa il codice +relativo ad un valore numerico con l'opzione \cmd{-l}. Il valore di \var{errno} viene sempre impostato a zero all'avvio di un programma, gran parte delle funzioni di libreria impostano \var{errno} ad un @@ -2277,8 +2278,8 @@ il valore \errval{EINVAL}. In generale \func{strerror} viene usata passando \var{errno} come argomento, ed il valore di quest'ultima non verrà modificato. La funzione inoltre tiene -conto del valore della variabile di ambiente \val{LC\_MESSAGES} per usare le -appropriate traduzioni dei messaggi d'errore nella localizzazione presente. +conto del valore della variabile di ambiente \envvar{LC\_MESSAGES} per usare +le appropriate traduzioni dei messaggi d'errore nella localizzazione presente. La funzione utilizza una stringa statica che non deve essere modificata dal programma; essa è utilizzabile solo fino ad una chiamata successiva a @@ -2287,7 +2288,7 @@ questa stringa. In ogni caso l'uso di una stringa statica rende la funzione non \index{funzioni!rientranti} rientrante, per cui nel caso si usino i \itindex{thread} \textit{thread} le librerie forniscono\footnote{questa funzione è la versione prevista dalle \acr{glibc}, ed effettivamente - definita in \file{string.h}, ne esiste una analoga nello standard SUSv3 + definita in \headfile{string.h}, ne esiste una analoga nello standard SUSv3 (quella riportata dalla pagina di manuale), che restituisce \code{int} al posto di \code{char *}, e che tronca la stringa restituita a \param{size}.} una apposita versione \index{funzioni!rientranti} rientrante @@ -2335,9 +2336,9 @@ punti e da uno spazio, il messaggio è terminato con un a capo. Il messaggio può essere riportato anche usando le due \index{variabili!globali} variabili globali: \includecodesnip{listati/errlist.c} -dichiarate in \file{errno.h}. La prima contiene i puntatori alle stringhe di -errore indicizzati da \var{errno}; la seconda esprime il valore più alto per -un codice di errore, l'utilizzo di questa stringa è sostanzialmente +dichiarate in \headfile{errno.h}. La prima contiene i puntatori alle stringhe +di errore indicizzati da \var{errno}; la seconda esprime il valore più alto +per un codice di errore, l'utilizzo di questa stringa è sostanzialmente equivalente a quello di \func{strerror}. \begin{figure}[!htbp] @@ -2446,15 +2447,15 @@ linea non vengano ripetuti. % LocalWords: SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG % LocalWords: Stevens exec CHILD STREAM stream TZNAME timezone NGROUPS SSIZE % LocalWords: ssize LISTIO JOB CONTROL job control IDS VERSION YYYYMML bits bc -% LocalWords: dall'header posix lim nell'header glibc run unistd name errno SC +% LocalWords: dall'header posix lim nell'header glibc run unistd name errno % LocalWords: NGROUP CLK TCK clock tick process PATH pathname BUF CANON path % LocalWords: pathconf fpathconf descriptor fd uname sys struct utsname info % LocalWords: EFAULT fig SOURCE NUL LENGTH DOMAIN NMLN UTSLEN system call proc % LocalWords: domainname sysctl BSD nlen void oldval size oldlenp newval EPERM -% LocalWords: newlen ENOTDIR EINVAL ENOMEM linux l'array oldvalue paging stack +% LocalWords: newlen ENOTDIR EINVAL ENOMEM linux array oldvalue paging stack % LocalWords: TCP shell Documentation ostype hostname osrelease version mount % LocalWords: const source filesystemtype mountflags ENODEV ENOTBLK block read -% LocalWords: device EBUSY only superblock point EACCES NODEV ENXIO major xC +% LocalWords: device EBUSY only EACCES NODEV ENXIO major % LocalWords: number EMFILE dummy ENAMETOOLONG ENOENT ELOOP virtual devfs MGC % LocalWords: magic MSK RDONLY NOSUID suid sgid NOEXEC SYNCHRONOUS REMOUNT MNT % LocalWords: MANDLOCK mandatory locking WRITE APPEND append IMMUTABLE NOATIME @@ -2469,17 +2470,17 @@ linea non vengano ripetuti. % LocalWords: line libc XPG utmpx getutxent getutxid getutxline pututxline who % LocalWords: setutxent endutxent wmtp updwtmp logwtmp wtmp host rusage utime % LocalWords: minflt majflt nswap fault swap timeval wait getrusage usage SELF -% LocalWords: CHILDREN current limit soft RLIMIT Address brk mremap mmap dump +% LocalWords: CHILDREN current limit soft RLIMIT address brk mremap mmap dump % LocalWords: SIGSEGV SIGXCPU SIGKILL sbrk FSIZE SIGXFSZ EFBIG LOCKS lock dup % LocalWords: MEMLOCK NOFILE NPROC fork EAGAIN SIGPENDING sigqueue kill RSS tv % LocalWords: resource getrlimit setrlimit rlimit rlim INFINITY capabilities % LocalWords: capability CAP l'I Sun Sparc PAGESIZE getpagesize SVr SUSv get % LocalWords: phys pages avphys NPROCESSORS CONF ONLN getloadavg stdlib double -% LocalWords: loadavg nelem scheduler CONFIG ACCT acct filename EACCESS EUSER +% LocalWords: loadavg nelem scheduler CONFIG ACCT acct filename EUSER % LocalWords: ENFILE EROFS PACCT AcctCtrl cap calendar UTC Jan the Epoch GMT % LocalWords: Greenwich Mean l'UTC timer CLOCKS SEC cron wall elapsed times tz -% LocalWords: tms dell' cutime cstime waitpid gettimeofday settimeofday timex -% LocalWords: timespec adjtime olddelta adjtimex David Mills nell' RFC NTP ntp +% LocalWords: tms cutime cstime waitpid gettimeofday settimeofday timex +% LocalWords: timespec adjtime olddelta adjtimex David Mills RFC NTP ntp % LocalWords: nell'RFC ADJ FREQUENCY frequency MAXERROR maxerror ESTERROR PLL % LocalWords: esterror TIMECONST constant SINGLESHOT MOD INS insert leap OOP % LocalWords: second delete progress has occurred BAD broken tm gmtoff asctime diff --git a/tcpsock.tex b/tcpsock.tex index 6b28862..3786c86 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -518,7 +518,7 @@ un socket solo da un processo con i privilegi di amministratore, per far sì che solo l'amministratore possa allocare queste porte per far partire i relativi servizi. -Le \textsl{glibc} definiscono (in \texttt{netinet/in.h}) +Le \textsl{glibc} definiscono in \headfile{netinet/in.h} \const{IPPORT\_RESERVED} e \const{IPPORT\_USERRESERVED}, in cui la prima (che vale 1024) indica il limite superiore delle porte riservate, e la seconda (che vale 5000) il limite inferiore delle porte a disposizione degli utenti. La @@ -577,7 +577,7 @@ posto in ascolto per connessioni provenienti da uno qualunque degli indirizzi associati alle interfacce locali. La notazione \texttt{0.0.0.0} usata da \cmd{netstat} è equivalente all'asterisco utilizzato per il numero di porta, indica il valore generico, e corrisponde al valore \const{INADDR\_ANY} -definito in \file{arpa/inet.h} (vedi \ref{tab:TCP_ipv4_addr}). +definito in \headfile{arpa/inet.h} (vedi \ref{tab:TCP_ipv4_addr}). Inoltre si noti come la porta e l'indirizzo di ogni eventuale connessione esterna non sono specificati; in questo caso la \textit{socket pair} associata @@ -760,7 +760,7 @@ metodo con IPv6, in cui l'indirizzo deve necessariamente essere specificato 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 \file{netinet/in.h} è definita una variabile +Per questo motivo nell'header \headfile{netinet/in.h} è definita una variabile \macro{in6addr\_any} (dichiarata come \direct{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 -- 2.30.2