X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=8f074839df2b65ff3375a0343db6bac6d84e551c;hp=39b73d9cd8a33d54c39e38a16a7bf99cc62ddba0;hb=dcf2c2df897955ff3503a7c426025457ab456fd7;hpb=4a64ffb309155737e851268a29e4217987a9c15e diff --git a/system.tex b/system.tex index 39b73d9..8f07483 100644 --- a/system.tex +++ b/system.tex @@ -1,6 +1,6 @@ %% system.tex %% -%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -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 @@ -402,8 +403,7 @@ riportate in tab.~\ref{tab:sys_file_macro}. \hline \const{LINK\_MAX} &8 & Numero massimo di link a un file.\\ \const{NAME\_MAX}& 14 & Lunghezza in byte di un nome di file. \\ - \const{PATH\_MAX}& 256 & Lunghezza in byte di un - \itindex{pathname} \textit{pathname}.\\ + \const{PATH\_MAX}& 256 & Lunghezza in byte di un \textit{pathname}.\\ \const{PIPE\_BUF}&4096 & Byte scrivibili atomicamente in una pipe (vedi sez.~\ref{sec:ipc_pipes}).\\ \const{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo @@ -434,7 +434,7 @@ le analoghe di tab.~\ref{tab:sys_posix1_general}. \const{\_POSIX\_LINK\_MAX} &8 & Numero massimo di link a un file.\\ \const{\_POSIX\_NAME\_MAX}& 14 & Lunghezza in byte di un nome di file.\\ \const{\_POSIX\_PATH\_MAX}& 256 & Lunghezza in byte di un - \itindex{pathname} \textit{pathname}.\\ + \textit{pathname}.\\ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una pipe.\\ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di @@ -452,9 +452,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}} @@ -477,13 +477,13 @@ E si noti come la funzione in questo caso richieda un argomento che specifichi a quale file si fa riferimento, dato che il valore del limite cercato può variare a seconda del filesystem. Una seconda versione della funzione, \funcd{fpathconf}, opera su un file descriptor invece che su un -\itindex{pathname} \textit{pathname}. Il suo prototipo è: +\textit{pathname}. Il suo prototipo è: \begin{prototype}{unistd.h}{long fpathconf(int fd, int name)} Restituisce il valore del parametro \param{name} per il file \param{fd}. \bodydesc{È identica a \func{pathconf} solo che utilizza un file descriptor - invece di un \itindex{pathname} \textit{pathname}; pertanto gli errori - restituiti cambiano di conseguenza.} + invece di un \textit{pathname}; pertanto gli errori restituiti cambiano di + conseguenza.} \end{prototype} \noindent ed il suo comportamento è identico a quello di \func{pathconf}. @@ -503,7 +503,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*} @@ -520,7 +520,7 @@ fig.~\ref{fig:sys_utsname}, solo definendo \macro{\_GNU\_SOURCE}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/ustname.h} \end{minipage} \normalsize @@ -597,13 +597,13 @@ 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 -alternativo del filesystem \file{/proc}, che vedremo dopo). +per la risoluzione di un \textit{pathname} (da cui l'uso alternativo del +filesystem \file{/proc}, che vedremo dopo). Ciascun nodo dell'albero è identificato da un valore intero, ed il cammino che arriva ad identificare un parametro specifico è passato alla funzione @@ -623,8 +623,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. @@ -646,9 +646,9 @@ forma di file alcune delle strutture interne del kernel stesso. In particolare l'albero dei valori di \func{sysctl} viene presentato in forma di file nella directory \file{/proc/sys}, cosicché è possibile accedervi -specificando un \itindex{pathname} \textit{pathname} e leggendo e scrivendo sul -file corrispondente al parametro scelto. Il kernel si occupa di generare al -volo il contenuto ed i nomi dei file corrispondenti, e questo ha il grande +specificando un \textit{pathname} e leggendo e scrivendo sul file +corrispondente al parametro scelto. Il kernel si occupa di generare al volo +il contenuto ed i nomi dei file corrispondenti, e questo ha il grande vantaggio di rendere accessibili i vari parametri a qualunque comando di shell e di permettere la navigazione dell'albero dei valori. @@ -663,270 +663,12 @@ inclusa nei sorgenti del kernel, nella directory \file{Documentation/sysctl}. Ma oltre alle informazioni ottenibili da \func{sysctl} dentro \file{proc} sono disponibili moltissime altre informazioni, fra cui ad esempio anche quelle fornite da \func{uname} (vedi sez.~\ref{sec:sys_uname}) che sono mantenute nei -file \procrelfile{/proc/sys/kernel}{ostype}, -\procrelfile{/proc/sys/kernel}{hostname}, -\procrelfile{/proc/sys/kernel}{osrelease}, -\procrelfile{/proc/sys/kernel}{version} e -\procrelfile{/proc/sys/kernel}{domainname} di \file{/proc/sys/kernel/}. +file \sysctlrelfile{kernel}{ostype}, \sysctlrelfile{kernel}{hostname}, +\sysctlrelfile{kernel}{osrelease}, \sysctlrelfile{kernel}{version} e +\sysctlrelfile{kernel}{domainname} di \file{/proc/sys/kernel/}. -\subsection{La gestione delle proprietà dei filesystem} -\label{sec:sys_file_config} - -Come accennato in sez.~\ref{sec:file_organization} per poter accedere ai file -occorre prima rendere disponibile al sistema il filesystem su cui essi sono -memorizzati; l'operazione di attivazione del filesystem è chiamata -\textsl{montaggio}, per far questo in Linux\footnote{la funzione è specifica - di Linux e non è portabile.} si usa la funzione \funcd{mount} il cui -prototipo è: -\begin{prototype}{sys/mount.h} -{mount(const char *source, const char *target, const char *filesystemtype, - unsigned long mountflags, const void *data)} - -Monta il filesystem di tipo \param{filesystemtype} contenuto in \param{source} -sulla directory \param{target}. - - \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di - fallimento, nel qual caso gli errori comuni a tutti i filesystem che possono - essere restituiti in \var{errno} sono: - \begin{errlist} - \item[\errcode{EPERM}] il processo non ha i privilegi di amministratore. - \item[\errcode{ENODEV}] \param{filesystemtype} non esiste o non è configurato - nel kernel. - \item[\errcode{ENOTBLK}] non si è usato un \textit{block device} per - \param{source} quando era richiesto. - \item[\errcode{EBUSY}] \param{source} è già montato, o non può essere - rimontato in read-only perché ci sono ancora file aperti in scrittura, o - \param{target} è ancora in uso. - \item[\errcode{EINVAL}] il device \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 - \textit{mount point} o di spostarlo quando \param{target} non è un - \textit{mount point} o è \file{/}. - \item[\errcode{EACCES}] non si ha il permesso di accesso su uno dei - componenti del \itindex{pathname} \textit{pathname}, o si è cercato - di montare un filesystem disponibile in sola lettura senza averlo - specificato o il device \param{source} è su un filesystem montato con - l'opzione \const{MS\_NODEV}. - \item[\errcode{ENXIO}] il \itindex{major~number} \textit{major number} del - device \param{source} è sbagliato. - \item[\errcode{EMFILE}] la tabella dei device \textit{dummy} è piena. - \end{errlist} - ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM}, - \errval{ENAMETOOLONG}, \errval{ENOENT} o \errval{ELOOP}.} -\end{prototype} - -La funzione monta sulla directory \param{target}, detta \textit{mount point}, -il filesystem contenuto in \param{source}. In generale un filesystem è -contenuto su un disco, e l'operazione di montaggio corrisponde a rendere -visibile al sistema il contenuto del suddetto disco, identificato attraverso -il file di dispositivo ad esso associato. - -Ma la struttura del virtual filesystem vista in sez.~\ref{sec:file_vfs} è molto -più flessibile e può essere usata anche per oggetti diversi da un disco. Ad -esempio usando il \textit{loop device} si può montare un file qualunque (come -l'immagine di un CD-ROM o di un floppy) che contiene un filesystem, inoltre -alcuni filesystem, come \file{proc} o \file{devfs} sono del tutto virtuali, i -loro dati sono generati al volo ad ogni lettura, e passati al kernel ad ogni -scrittura. - -Il tipo di filesystem è specificato da \param{filesystemtype}, che deve essere -una delle stringhe riportate nel file \procfile{/proc/filesystems}, che -contiene l'elenco dei filesystem supportati dal kernel; nel caso si sia -indicato uno dei filesystem virtuali, il contenuto di \param{source} viene -ignorato. - -Dopo l'esecuzione della funzione il contenuto del filesystem viene resto -disponibile nella directory specificata come \textit{mount point}, il -precedente contenuto di detta directory viene mascherato dal contenuto della -directory radice del filesystem montato. - -Dal kernel 2.4.x inoltre è divenuto possibile sia spostare atomicamente un -\textit{mount point} da una directory ad un'altra, sia montare in diversi -\textit{mount point} lo stesso filesystem, sia montare più filesystem sullo -stesso \textit{mount point} (nel qual caso vale quanto appena detto, e solo il -contenuto dell'ultimo filesystem montato sarà visibile). - -Ciascun filesystem è dotato di caratteristiche specifiche che possono essere -attivate o meno, alcune di queste sono generali (anche se non è detto siano -disponibili in ogni filesystem), e vengono specificate come opzioni di -montaggio con l'argomento \param{mountflags}. - -In Linux \param{mountflags} deve essere un intero a 32 bit i cui 16 più -significativi sono un \textit{magic number}\footnote{cioè un numero speciale - usato come identificativo, che nel caso è \code{0xC0ED}; si può usare la - costante \const{MS\_MGC\_MSK} per ottenere la parte di \param{mountflags} - riservata al \textit{magic number}.} mentre i 16 meno significativi sono -usati per specificare le opzioni; essi sono usati come maschera binaria e -vanno impostati con un OR aritmetico della costante \const{MS\_MGC\_VAL} con i -valori riportati in tab.~\ref{tab:sys_mount_flags}. - -\begin{table}[htb] - \footnotesize - \centering - \begin{tabular}[c]{|l|r|l|} - \hline - \textbf{Parametro} & \textbf{Valore}&\textbf{Significato}\\ - \hline - \hline - \const{MS\_RDONLY} & 1 & Monta in sola lettura.\\ - \const{MS\_NOSUID} & 2 & Ignora i bit \itindex{suid~bit} \acr{suid} e - \itindex{sgid~bit} \acr{sgid}.\\ - \const{MS\_NODEV} & 4 & Impedisce l'accesso ai file di dispositivo.\\ - \const{MS\_NOEXEC} & 8 & Impedisce di eseguire programmi.\\ - \const{MS\_SYNCHRONOUS}& 16 & Abilita la scrittura sincrona.\\ - \const{MS\_REMOUNT} & 32 & Rimonta il filesystem cambiando le opzioni.\\ - \const{MS\_MANDLOCK} & 64 & Consente il \textit{mandatory locking} - \itindex{mandatory~locking} (vedi - sez.~\ref{sec:file_mand_locking}).\\ - \const{S\_WRITE} & 128 & Scrive normalmente.\\ - \const{S\_APPEND} & 256 & Consente la scrittura solo in - \itindex{append~mode} \textit{append mode} - (vedi sez.~\ref{sec:file_sharing}).\\ - \const{S\_IMMUTABLE} & 512 & Impedisce che si possano modificare i file.\\ - \const{MS\_NOATIME} &1024 & Non aggiorna gli \textit{access time} (vedi - sez.~\ref{sec:file_file_times}).\\ - \const{MS\_NODIRATIME}&2048 & Non aggiorna gli \textit{access time} delle - directory.\\ - \const{MS\_BIND} &4096 & Monta il filesystem altrove.\\ - \const{MS\_MOVE} &8192 & Sposta atomicamente il punto di montaggio.\\ - \hline - \end{tabular} - \caption{Tabella dei codici dei flag di montaggio di un filesystem.} - \label{tab:sys_mount_flags} -\end{table} - -% TODO aggiornare con i nuovi flag di man mount -% gli S_* non esistono più come segnalato da Alessio... -% verificare i readonly mount bind del 2.6.26 - -Per l'impostazione delle caratteristiche particolari di ciascun filesystem si -usa invece l'argomento \param{data} che serve per passare le ulteriori -informazioni necessarie, che ovviamente variano da filesystem a filesystem. - -La funzione \func{mount} può essere utilizzata anche per effettuare il -\textsl{rimontaggio} di un filesystem, cosa che permette di cambiarne al volo -alcune delle caratteristiche di funzionamento (ad esempio passare da sola -lettura a lettura/scrittura). Questa operazione è attivata attraverso uno dei -bit di \param{mountflags}, \const{MS\_REMOUNT}, che se impostato specifica che -deve essere effettuato il rimontaggio del filesystem (con le opzioni -specificate dagli altri bit), anche in questo caso il valore di \param{source} -viene ignorato. - -Una volta che non si voglia più utilizzare un certo filesystem è possibile -\textsl{smontarlo} usando la funzione \funcd{umount}, il cui prototipo è: -\begin{prototype}{sys/mount.h}{umount(const char *target)} - - Smonta il filesystem montato sulla directory \param{target}. - - \bodydesc{La funzione ritorna 0 in caso di successo e -1 in caso di - fallimento, 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. - \end{errlist} - ed inoltre \errval{ENOTDIR}, \errval{EFAULT}, \errval{ENOMEM}, - \errval{ENAMETOOLONG}, \errval{ENOENT} o \errval{ELOOP}.} -\end{prototype} -\noindent 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 \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 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 -risulti occupato; il suo prototipo è: -\begin{prototype}{sys/mount.h}{umount2(const char *target, int flags)} - - La funzione è identica a \func{umount} per comportamento e codici di errore, - ma con \param{flags} si può specificare se forzare lo smontaggio. -\end{prototype} - -Il valore di \param{flags} è una maschera binaria, e al momento l'unico valore -definito è il bit \const{MNT\_FORCE}; gli altri bit devono essere nulli. -Specificando \const{MNT\_FORCE} la funzione cercherà di liberare il filesystem -anche se è occupato per via di una delle condizioni descritte in precedenza. A -seconda del tipo di filesystem alcune (o tutte) possono essere superate, -evitando l'errore di \errcode{EBUSY}. In tutti i casi prima dello smontaggio -viene eseguita una sincronizzazione dei dati. - -% TODO documentare MNT_DETACH e MNT_EXPIRE ... - -Altre due funzioni specifiche di Linux,\footnote{esse si trovano anche su BSD, - ma con una struttura diversa.} utili per ottenere in maniera diretta -informazioni riguardo al filesystem su cui si trova un certo file, sono -\funcd{statfs} e \funcd{fstatfs}, i cui prototipi sono: -\begin{functions} - \headdecl{sys/vfs.h} - \funcdecl{int statfs(const char *path, struct statfs *buf)} - - \funcdecl{int fstatfs(int fd, struct statfs *buf)} - - Restituisce in \param{buf} le informazioni relative al filesystem su cui è - posto il file specificato. - - \bodydesc{Le funzioni ritornano 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà uno dei valori: - \begin{errlist} - \item[\errcode{ENOSYS}] il filesystem su cui si trova il file specificato non - supporta la funzione. - \end{errlist} - e \errval{EFAULT} ed \errval{EIO} per entrambe, \errval{EBADF} per - \func{fstatfs}, \errval{ENOTDIR}, \errval{ENAMETOOLONG}, \errval{ENOENT}, - \errval{EACCES}, \errval{ELOOP} per \func{statfs}.} -\end{functions} - -Queste funzioni permettono di ottenere una serie di informazioni generali -riguardo al filesystem su cui si trova il file specificato; queste vengono -restituite all'indirizzo \param{buf} di una struttura \struct{statfs} definita -come in fig.~\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il -filesystem in esame sono impostati a zero. I valori del campo \var{f\_type} -sono definiti per i vari filesystem nei relativi file di header dei sorgenti -del kernel da costanti del tipo \var{XXX\_SUPER\_MAGIC}, dove \var{XXX} in -genere è il nome del filesystem stesso. - -\begin{figure}[!htb] - \footnotesize \centering - \begin{minipage}[c]{15cm} - \includestruct{listati/statfs.h} - \end{minipage} - \normalsize - \caption{La struttura \structd{statfs}.} - \label{fig:sys_statfs} -\end{figure} - - -Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due -file \conffile{/etc/fstab} ed \conffile{/etc/mtab}, che convenzionalmente sono -usati in quasi tutti i sistemi unix-like per mantenere rispettivamente le -informazioni riguardo ai filesystem da montare e a quelli correntemente -montati. Le funzioni servono a leggere il contenuto di questi file in -opportune strutture \struct{fstab} e \struct{mntent}, e, per -\conffile{/etc/mtab} per inserire e rimuovere le voci presenti nel file. - -In generale si dovrebbero usare queste funzioni (in particolare quelle -relative a \conffile{/etc/mtab}), quando si debba scrivere un programma che -effettua il montaggio di un filesystem; in realtà in questi casi è molto più -semplice invocare direttamente il programma \cmd{mount}, per cui ne -tralasceremo la trattazione, rimandando al manuale delle \acr{glibc} -\cite{glibc} per la documentazione completa. - -% TODO scrivere relativamente alle varie funzioni (getfsent e getmntent &C) -% TODO documentare swapon e swapoff (man 2 ...) - - % TODO documentare keyctl ???? % (fare sezione dedicata ????) %\subsection{La gestione delle chiavi crittografiche} @@ -950,7 +692,7 @@ ed \conffile{/etc/group},\footnote{in realtà oltre a questi nelle \conffile{/etc/gshadow}, in cui sono state spostate le informazioni di autenticazione (ed inserite alcune estensioni) per toglierle dagli altri file che devono poter essere letti per poter effettuare l'associazione fra - username e \acr{uid}.} il cui formato è descritto dalle relative pagine del + username e \ids{UID}.} il cui formato è descritto dalle relative pagine del manuale\footnote{nella quinta sezione, quella dei file di configurazione, occorre cioè usare \cmd{man 5 passwd} dato che altrimenti si avrebbe la pagina di manuale del comando \cmd{passwd}.} e tutte le funzioni che @@ -974,9 +716,10 @@ dall'altra con il diffondersi delle reti la necessità di centralizzare le informazioni degli utenti e dei gruppi per insiemi di macchine, in modo da mantenere coerenti i dati, ha portato anche alla necessità di poter recuperare e memorizzare dette informazioni su supporti diversi, introducendo il sistema -del \itindex{Name~Service~Switch} \textit{Name Service Switch} che tratteremo -brevemente più avanti (in sez.~\ref{sec:sock_resolver}) dato che la maggior -parte delle sua applicazioni sono relative alla risoluzioni di nomi di rete. +del \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} che +tratteremo brevemente più avanti (in sez.~\ref{sec:sock_resolver}) dato che la +maggior parte delle sua applicazioni sono relative alla risoluzioni di nomi di +rete. In questo paragrafo ci limiteremo comunque a trattare le funzioni classiche per la lettura delle informazioni relative a utenti e gruppi tralasciando @@ -987,7 +730,7 @@ completamente quelle relative all'autenticazione. % \acr{glibc} per modularizzare l'accesso a tutti i servizi in cui sia % necessario trovare una corrispondenza fra un nome ed un numero (od altra % informazione) ad esso associato, come appunto, quella fra uno username ed un -% \acr{uid} o fra un \acr{gid} ed il nome del gruppo corrispondente. +% \ids{UID} o fra un \ids{GID} ed il nome del gruppo corrispondente. Le prime funzioni che vedremo sono quelle previste dallo standard POSIX.1; queste sono del tutto generiche e si appoggiano direttamente al \textit{Name Service Switch}, per cui sono in grado di ricevere informazioni qualunque @@ -1010,16 +753,16 @@ relative ad un utente si possono usare due funzioni, \funcd{getpwuid} e 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 \acr{uid} o il nome di +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 \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/passwd.h} \end{minipage} \normalsize @@ -1097,7 +840,7 @@ fig.~\ref{fig:sys_group_struct}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/group.h} \end{minipage} \normalsize @@ -1108,15 +851,16 @@ fig.~\ref{fig:sys_group_struct}. Le funzioni viste finora sono in grado di leggere le informazioni sia direttamente dal file delle password in \conffile{/etc/passwd} che tramite il -sistema del \itindex{Name~Service~Switch} \textit{Name Service Switch} e sono -completamente generiche. Si noti però che non c'è una funzione che permetta di -impostare direttamente una password.\footnote{in realtà questo può essere - fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che POSIX non -prevede questa possibilità esiste un'altra interfaccia che lo fa, derivata da -SVID le cui funzioni sono riportate in tab.~\ref{tab:sys_passwd_func}. Questa -però funziona soltanto quando le informazioni sono mantenute su un apposito -file di \textsl{registro} di utenti e gruppi, con il formato classico di -\conffile{/etc/passwd} e \conffile{/etc/group}. +sistema del \itindex{Name~Service~Switch~(NSS)} \textit{Name Service Switch} e +sono completamente generiche. Si noti però che non c'è una funzione che +permetta di impostare direttamente una password.\footnote{in realtà questo può + essere fatto ricorrendo a PAM, ma questo è un altro discorso.} Dato che +POSIX non prevede questa possibilità esiste un'altra interfaccia che lo fa, +derivata da SVID le cui funzioni sono riportate in +tab.~\ref{tab:sys_passwd_func}. Questa però funziona soltanto quando le +informazioni sono mantenute su un apposito file di \textsl{registro} di utenti +e gruppi, con il formato classico di \conffile{/etc/passwd} e +\conffile{/etc/group}. \begin{table}[htb] \footnotesize @@ -1126,27 +870,27 @@ file di \textsl{registro} di utenti e gruppi, con il formato classico di \textbf{Funzione} & \textbf{Significato}\\ \hline \hline - \func{fgetpwent} & Legge una voce dal file di registro degli utenti + \funcm{fgetpwent} & Legge una voce dal file di registro degli utenti + specificato.\\ + \funcm{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ + \funcm{putpwent} & Immette una voce in un file di registro degli + utenti.\\ + \funcm{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\ + \funcm{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ + \funcm{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\ + \funcm{endpwent} & Chiude \conffile{/etc/passwd}.\\ + \funcm{fgetgrent} & Legge una voce dal file di registro dei gruppi specificato.\\ - \func{fgetpwent\_r}& Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ - \func{putpwent} & Immette una voce in un file di registro degli - utenti.\\ - \func{getpwent} & Legge una voce da \conffile{/etc/passwd}.\\ - \func{getpwent\_r} & Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ - \func{setpwent} & Ritorna all'inizio di \conffile{/etc/passwd}.\\ - \func{endpwent} & Chiude \conffile{/etc/passwd}.\\ - \func{fgetgrent} & Legge una voce dal file di registro dei gruppi - specificato.\\ - \func{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ - \func{putgrent} & Immette una voce in un file di registro dei gruppi.\\ - \func{getgrent} & Legge una voce da \conffile{/etc/group}.\\ - \func{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti} - rientrante.\\ - \func{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\ - \func{endgrent} & Chiude \conffile{/etc/group}.\\ + \funcm{fgetgrent\_r}& Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ + \funcm{putgrent} & Immette una voce in un file di registro dei gruppi.\\ + \funcm{getgrent} & Legge una voce da \conffile{/etc/group}.\\ + \funcm{getgrent\_r} & Come la precedente, ma \index{funzioni!rientranti} + rientrante.\\ + \funcm{setgrent} & Ritorna all'inizio di \conffile{/etc/group}.\\ + \funcm{endgrent} & Chiude \conffile{/etc/group}.\\ \hline \end{tabular} \caption{Funzioni per la manipolazione dei campi di un file usato come @@ -1155,6 +899,8 @@ file di \textsl{registro} di utenti e gruppi, con il formato classico di \label{tab:sys_passwd_func} \end{table} +% TODO mancano i prototipi di alcune delle funzioni + Dato che oramai la gran parte delle distribuzioni di GNU/Linux utilizzano almeno le \textit{shadow password} (quindi con delle modifiche rispetto al formato classico del file \conffile{/etc/passwd}), si tenga presente che le @@ -1190,7 +936,7 @@ I dati vengono usualmente\footnote{questa è la locazione specificata dal \file{/var/log/btmp} dove invece vengono memorizzati dal programma di login tutti tentativi di accesso fallito.} Quando un utente si collega viene aggiunta una voce a \file{/var/run/utmp} in cui viene memorizzato il nome di -login, il terminale da cui ci si collega, l'\acr{uid} della shell di login, +login, il terminale da cui ci si collega, l'\ids{UID} della shell di login, l'orario della connessione ed altre informazioni. La voce resta nel file fino al logout, quando viene cancellata e spostata in \file{/var/log/wtmp}. @@ -1231,10 +977,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 @@ -1243,7 +989,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}, @@ -1278,7 +1024,7 @@ disponibile; le altre due permettono di eseguire una ricerca. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/utmp.h} \end{minipage} \normalsize @@ -1341,15 +1087,17 @@ sono un sovrainsieme di \code{utmp}. Le \acr{glibc} utilizzano già una versione estesa di \code{utmp}, che rende inutili queste nuove strutture; pertanto esse e le relative funzioni di -gestione (\func{getutxent}, \func{getutxid}, \func{getutxline}, -\func{pututxline}, \func{setutxent} e \func{endutxent}) sono ridefinite come +gestione (\funcm{getutxent}, \funcm{getutxid}, \funcm{getutxline}, +\funcm{pututxline}, \funcm{setutxent} e \funcm{endutxent}) sono ridefinite come sinonimi delle funzioni appena viste. +% TODO (verificare le funzioni di cui sopra ) + Come visto in sez.~\ref{sec:sys_user_group}, l'uso di strutture allocate staticamente rende le funzioni di lettura non \index{funzioni!rientranti} rientranti; per questo motivo le \acr{glibc} forniscono anche delle versioni -\index{funzioni!rientranti} rientranti: \func{getutent\_r}, \func{getutid\_r}, -\func{getutline\_r}, che invece di restituire un puntatore restituiscono un +\index{funzioni!rientranti} rientranti: \funcm{getutent\_r}, \funcm{getutid\_r}, +\funcm{getutline\_r}, che invece di restituire un puntatore restituiscono un intero e prendono due argomenti aggiuntivi. Le funzioni si comportano esattamente come le analoghe non \index{funzioni!rientranti} rientranti, solo che restituiscono il risultato all'indirizzo specificato dal primo argomento @@ -1394,12 +1142,12 @@ 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 \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/rusage.h} \end{minipage} \normalsize @@ -1479,6 +1227,8 @@ essere aumentato dal processo stesso durante l'esecuzione, ciò può però esser fatto solo fino al valore del secondo, che per questo viene detto \textit{hard limit}. +%TODO: tabella troppo grossa, trasformare in lista + \begin{table}[htb] \footnotesize \centering @@ -1496,7 +1246,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard \errcode{ENOMEM}, mentre se il superamento viene causato dalla crescita dello \itindex{stack} \textit{stack} il processo riceverà un segnale di - \const{SIGSEGV}.\\ + \signal{SIGSEGV}.\\ \const{RLIMIT\_CORE} & La massima dimensione per di un file di \itindex{core~dump} \textit{core dump} (vedi sez.~\ref{sec:sig_prog_error}) creato nella @@ -1508,13 +1258,13 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il superamento del limite corrente comporta l'emissione di un segnale di - \const{SIGXCPU}, la cui azione predefinita (vedi + \signal{SIGXCPU}, la cui azione predefinita (vedi sez.~\ref{sec:sig_classification}) è terminare il processo, una volta al secondo fino al raggiungimento del limite massimo. Il superamento del limite massimo comporta l'emissione di un segnale di - \const{SIGKILL}.\footnotemark\\ + \signal{SIGKILL}.\footnotemark\\ \const{RLIMIT\_DATA} & La massima dimensione del \index{segmento!dati} segmento dati di un processo (vedi sez.~\ref{sec:proc_mem_layout}). @@ -1525,13 +1275,13 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard \const{RLIMIT\_FSIZE} & La massima dimensione di un file che un processo può creare. Se il processo cerca di scrivere oltre questa dimensione riceverà un segnale di - \const{SIGXFSZ}, che di norma termina il + \signal{SIGXFSZ}, che di norma termina il processo; se questo viene intercettato la system call che ha causato l'errore fallirà con un errore di \errcode{EFBIG}.\\ \const{RLIMIT\_LOCKS}& È un limite presente solo nelle prime versioni del kernel 2.4 sul numero massimo di - \index{file!locking} \textit{file lock} (vedi + \itindex{file~locking} \textit{file lock} (vedi sez.~\ref{sec:file_locking}) che un processo poteva effettuare.\\ \const{RLIMIT\_MEMLOCK}& L'ammontare massimo di memoria che può essere @@ -1568,12 +1318,21 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard \textit{stack} del processo. Se il processo esegue operazioni che estendano lo \textit{stack} oltre questa dimensione - riceverà un segnale di \const{SIGSEGV}.\\ + riceverà un segnale di \signal{SIGSEGV}.\\ +% TODO dal 2.6.23 il significato è cambiato, vedi anche man execve \const{RLIMIT\_RSS} & L'ammontare massimo di pagine di memoria dato al \index{segmento!testo} testo del processo. Il limite è solo una indicazione per il kernel, qualora ci fosse un surplus di memoria questa verrebbe assegnata.\\ +% TODO: aggiungere a \const{RLIMIT\_STACK} i dati di execve: +% Questi fino al kernel 2.6.23 erano fissi e costituiti da +% 32 pagine di memoria (corrispondenti per la gran parte delle architetture a +% 128kb di dati). Dal 2.6.23 su molte architettire il limite viene stabilito in +% base al valore della risorsa \const{RLIMIT\_STACK} (vedi +% sez.~\ref{sec:sys_resource_limit}), ad un quarto dello spazio da essa +% indicato). Dal 2.6.25 viene comunque garantito uno spazio base di 32 pagine. + % TODO integrare con la roba di madvise % TODO integrare con le ultime aggiunte, vedi pagina di manuale \hline @@ -1587,7 +1346,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard oggi (la 2.6.x); altri kernel possono avere comportamenti diversi per quanto avviene quando viene superato il \textit{soft limit}; perciò per avere operazioni portabili è sempre opportuno intercettare il primo - \const{SIGXCPU} e terminare in maniera ordinata il processo.} + \signal{SIGXCPU} e terminare in maniera ordinata il processo.} \footnotetext{il limite su questa risorsa è stato introdotto con il kernel 2.6.8.} @@ -1644,7 +1403,7 @@ limite corrente e limite massimo. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/rlimit.h} \end{minipage} \normalsize @@ -1781,12 +1540,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}, @@ -1794,25 +1553,24 @@ prototipo è: \errval{ENOTDIR}, \errval{EROFS}.} \end{prototype} -La funzione attiva il salvataggio dei dati sul file indicato dal pathname -contenuti nella stringa puntata da \param{filename}; la funzione richiede che -il processo abbia i privilegi di amministratore (è necessaria la -\itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi +La funzione attiva il salvataggio dei dati sul file indicato dal +\textit{pathname} contenuti nella stringa puntata da \param{filename}; la +funzione richiede che il processo abbia i privilegi di amministratore (è +necessaria la \itindex{capabilities} capability \const{CAP\_SYS\_PACCT}, vedi sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \val{NULL} per \param{filename} il \textit{BSD accounting} viene invece disabilitato. Un semplice esempio per l'uso di questa funzione è riportato nel programma \texttt{AcctCtrl.c} dei sorgenti allegati alla guida. Quando si attiva la contabilità, il file che si indica deve esistere; esso -verrà aperto in sola scrittura;\footnote{si applicano al pathname indicato da - \param{filename} tutte le restrizioni viste in cap.~\ref{cha:file_intro}.} -le informazioni verranno registrate in \itindex{append~mode} \textit{append} -in coda al file tutte le volte che un processo termina. Le informazioni -vengono salvate in formato binario, e corrispondono al contenuto della -apposita struttura dati definita all'interno del kernel. +verrà aperto in sola scrittura; le informazioni verranno registrate in +\itindex{append~mode} \textit{append} in coda al file tutte le volte che un +processo termina. Le informazioni vengono salvate in formato binario, e +corrispondono al contenuto della apposita struttura dati definita all'interno +del kernel. Il funzionamento di \func{acct} viene inoltre modificato da uno specifico -parametro di sistema, modificabile attraverso \procfile{/proc/sys/kernel/acct} +parametro di sistema, modificabile attraverso \sysctlfile{kernel/acct} (o tramite la corrispondente \func{sysctl}). Esso contiene tre valori interi, il primo indica la percentuale di spazio disco libero sopra il quale viene ripresa una registrazione che era stata sospesa per essere scesi sotto il @@ -1861,7 +1619,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} @@ -1939,6 +1697,8 @@ costante \const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore riprenderà lo stesso valore iniziale. +% TODO questi valori sono obsoleti, verificare il tutto. + Come accennato in sez.~\ref{sec:sys_unix_time} il tempo di CPU è la somma di altri due tempi, l'\textit{user time} ed il \textit{system time} che sono quelli effettivamente mantenuti dal kernel per ciascun processo. Questi @@ -1961,7 +1721,7 @@ sez.~\ref{sec:sys_unix_time}. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/tms.h} \end{minipage} \normalsize @@ -2103,7 +1863,7 @@ effettuato. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/timex.h} \end{minipage} \normalsize @@ -2127,9 +1887,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 @@ -2282,7 +2042,7 @@ tempo in una stringa contenente data ed ora, i loro prototipi sono: \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/tm.h} \end{minipage} \normalsize @@ -2324,9 +2084,10 @@ restituita la conversione. Come mostrato in fig.~\ref{fig:sys_tm_struct} il \textit{broken-down time} permette di tenere conto anche della differenza fra tempo universale e ora locale, compresa l'eventuale ora legale. Questo viene fatto attraverso le tre -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 +\index{variabili!globali} variabili globali mostrate in +fig.~\ref{fig:sys_tzname}, cui si accede quando si include +\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)} @@ -2336,19 +2097,19 @@ funzione \funcd{tzset}, il cui prototipo è: \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 \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/time_zone_var.c} \end{minipage} \normalsize - \caption{Le variabili globali usate per la gestione delle \textit{time - zone}.} + \caption{Le \index{variabili!globali} variabili globali usate per la + gestione delle \textit{time zone}.} \label{fig:sys_tzname} \end{figure} @@ -2463,14 +2224,14 @@ c'è stato un errore. Di solito questo valore è -1 o un puntatore nullo o la costante \val{EOF} (a seconda della funzione); ma questo valore segnala solo che c'è stato un errore, non il tipo di errore. -Per riportare il tipo di errore il sistema usa la variabile globale -\var{errno},\footnote{l'uso di una variabile globale può comportare alcuni - problemi (ad esempio nel caso dei \itindex{thread} \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 +Per riportare il tipo di errore il sistema usa \index{variabili!globali} la +variabile globale \var{errno},\footnote{l'uso di una variabile globale può + comportare alcuni problemi (ad esempio nel caso dei \itindex{thread} + \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 \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 @@ -2478,12 +2239,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 @@ -2522,8 +2283,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 @@ -2532,11 +2293,11 @@ 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 -\func{strerror\_r}, il cui prototipo è: +\funcd{strerror\_r}, il cui prototipo è: \begin{prototype}{string.h} {char * strerror\_r(int errnum, char *buf, size\_t size)} @@ -2577,16 +2338,17 @@ riferiscono all'ultimo errore avvenuto. La stringa specificata con \param{message} viene stampato prima del messaggio d'errore, seguita dai due punti e da uno spazio, il messaggio è terminato con un a capo. -Il messaggio può essere riportato anche usando le due variabili globali: +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}[!htb] +\begin{figure}[!htbp] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\codesamplewidth} \includecodesample{listati/errcode_mess.c} \end{minipage} \normalsize @@ -2601,7 +2363,7 @@ completo del programma è allegato nel file \file{ErrCode.c} e contiene pure la gestione delle opzioni e tutte le definizioni necessarie ad associare il valore numerico alla costante simbolica. In particolare si è riportata la sezione che converte la stringa passata come argomento in un intero -(\texttt{\small 1--2}), controllando con i valori di ritorno di \func{strtol} +(\texttt{\small 1--2}), controllando con i valori di ritorno di \funcm{strtol} che la conversione sia avvenuta correttamente (\texttt{\small 4--10}), e poi stampa, a seconda dell'opzione scelta il messaggio di errore (\texttt{\small 11--14}) o la macro (\texttt{\small 15--17}) associate a quel codice. @@ -2646,8 +2408,9 @@ l'argomento \param{format} prende la stessa sintassi di \func{printf}, ed i relativi argomenti devono essere forniti allo stesso modo, mentre \param{errnum} indica l'errore che si vuole segnalare (non viene quindi usato il valore corrente di \var{errno}); la funzione stampa sullo standard error il -nome del programma, come indicato dalla variabile globale \var{program\_name}, -seguito da due punti ed uno spazio, poi dalla stringa generata da +nome del programma, come indicato dalla \index{variabili!globali} variabile +globale \var{program\_name}, seguito da due punti ed uno spazio, poi dalla +stringa generata da \param{format} e dagli argomenti seguenti, seguita da due punti ed uno spazio infine il messaggio di errore relativo ad \param{errnum}, il tutto è terminato da un a capo. @@ -2661,8 +2424,8 @@ L'argomento \param{status} può essere usato per terminare direttamente il programma in caso di errore, nel qual caso \func{error} dopo la stampa del messaggio di errore chiama \func{exit} con questo stato di uscita. Se invece il valore è nullo \func{error} ritorna normalmente ma viene incrementata -un'altra variabile globale, \var{error\_message\_count}, che tiene conto di -quanti errori ci sono stati. +un'altra \index{variabili!globali} variabile globale, +\var{error\_message\_count}, che tiene conto di quanti errori ci sono stati. Un'altra funzione per la stampa degli errori, ancora più sofisticata, che prende due argomenti aggiuntivi per indicare linea e file su cui è avvenuto @@ -2678,9 +2441,10 @@ Stampa un messaggio di errore formattato. \noindent ed il suo comportamento è identico a quello di \func{error} se non per il fatto che, separati con il solito due punti-spazio, vengono inseriti un nome di file indicato da \param{fname} ed un numero di linea subito dopo la -stampa del nome del programma. Inoltre essa usa un'altra variabile globale, -\var{error\_one\_per\_line}, che impostata ad un valore diverso da zero fa si -che errori relativi alla stessa linea non vengano ripetuti. +stampa del nome del programma. Inoltre essa usa un'altra +\index{variabili!globali} variabile globale, \var{error\_one\_per\_line}, che +impostata ad un valore diverso da zero fa si che errori relativi alla stessa +linea non vengano ripetuti. % LocalWords: filesystem like kernel saved header limits sysconf sez tab float @@ -2688,15 +2452,15 @@ che errori relativi alla stessa 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 @@ -2711,17 +2475,17 @@ che errori relativi alla stessa 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