X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=1b4a1b0bea65124db1980343759bbaa7bbb6b8e0;hp=2c7cf2d4ef0047dfb00634269efab8a9f47e99df;hb=4aa6c51696d2b11c572eccd37238db1691785573;hpb=fdbd17cde3c32139f572fb495ed1d48088f1457c diff --git a/system.tex b/system.tex index 2c7cf2d..1b4a1b0 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", @@ -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 @@ -559,7 +559,7 @@ lettura. Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si usano per il controllo di altre caratteristiche generali del sistema, come quelle per la gestione dei filesystem e di utenti e gruppi. -% TODO ristrutturare e aggiungere \func{prctl} +% TODO ristrutturare ? \subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}} \label{sec:sys_sysctl} @@ -663,275 +663,21 @@ 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} +%\subsection{La gestione delle chiavi crittografiche} %\label{sec:keyctl_management} +% +% \subsection{La gestione dello spegnimento e del riavvio} +%\label{sec:sys_reboot} +% TODO trattare reboot, kexec_load, ... \subsection{La gestione delle informazioni su utenti e gruppi} @@ -946,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 @@ -983,7 +729,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 @@ -1006,7 +752,7 @@ 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 @@ -1015,7 +761,7 @@ 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 @@ -1093,7 +839,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 @@ -1186,7 +932,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}. @@ -1274,7 +1020,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 @@ -1395,7 +1141,7 @@ di tipo \struct{rusage}, la cui definizione (che si trova in \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/rusage.h} \end{minipage} \normalsize @@ -1475,6 +1221,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 @@ -1492,7 +1240,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 @@ -1504,13 +1252,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}). @@ -1521,13 +1269,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 @@ -1564,12 +1312,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 @@ -1583,7 +1340,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.} @@ -1640,7 +1397,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 @@ -1794,21 +1551,20 @@ 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 -sez.~\ref{sec:proc_capabilities}). Se si specifica il valore \const{NULL} per +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 @@ -1935,6 +1691,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 @@ -1957,7 +1715,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 @@ -2099,7 +1857,7 @@ effettuato. \begin{figure}[!htb] \footnotesize \centering - \begin{minipage}[c]{15cm} + \begin{minipage}[c]{\textwidth} \includestruct{listati/timex.h} \end{minipage} \normalsize @@ -2278,7 +2036,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 @@ -2320,10 +2078,11 @@ 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 -funzione \funcd{tzset}, il cui prototipo è: +\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 è: \begin{prototype}{sys/timex.h} {void tzset(void)} @@ -2339,12 +2098,12 @@ 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} @@ -2459,12 +2218,12 @@ 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 +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 \file{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} @@ -2573,16 +2332,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 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 @@ -2642,8 +2402,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. @@ -2657,8 +2418,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 @@ -2674,9 +2435,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