%% system.tex
%%
-%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2007 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",
%% license is included in the section entitled "GNU Free Documentation
%% License".
%%
+
\chapter{La gestione del sistema, del tempo e degli errori}
\label{cha:system}
\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}.\\
+ \itindex{pathname} \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
\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}.\\
+ \itindex{pathname} \textit{pathname}.\\
\const{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
pipe.\\
\const{\_POSIX\_MAX\_CANON}&255 & dimensione di una riga di
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 è:
+\itindex{pathname} \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
+ invece di un \itindex{pathname} \textit{pathname}; pertanto gli errori
restituiti cambiano di conseguenza.}
\end{prototype}
\noindent ed il suo comportamento è identico a quello di \func{pathconf}.
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
+per la risoluzione di un \itindex{pathname} \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
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
+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
vantaggio di rendere accessibili i vari parametri a qualunque comando di shell
\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
+ 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}.
\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}.\\
+ \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 i flag.\\
- \const{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking} (vedi
+ \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
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
+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.
Le funzioni viste finora sono in grado di leggere le informazioni sia
direttamente dal file delle password in \file{/etc/passwd} che tramite il
-sistema del \itindex{Name~Service~Switch}\textit{Name Service Switch} e
+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
I dati vengono usualmente\footnote{questa è la locazione specificata dal
\textit{Linux Filesystem Hierarchy Standard}, adottato dalla gran parte
delle distribuzioni.} memorizzati nei due file \file{/var/run/utmp} e
-\file{/var/log/wtmp}. 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, 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}.
+\file{/var/log/wtmp}.\footnote{non si confonda quest'ultimo con il simile
+ \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,
+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}.
In questo modo il primo file viene utilizzato per registrare chi sta
utilizzando il sistema al momento corrente, mentre il secondo mantiene la
\bodydesc{Le funzioni non ritornano codici di errore.}
\end{functions}
-
-In caso questo non venga specificato nessun file viene usato il valore
-standard \const{\_PATH\_UTMP} (che è definito in \file{paths.h}); in genere
-\func{utmpname} prevede due possibili valori:
+e si tenga presente che le funzioni non restituiscono nessun valore, pertanto
+non è possibile accorgersi di eventuali errori (ad esempio se si è impostato
+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:
\begin{basedescript}{\desclabelwidth{2.0cm}}
-\item[\const{\_PATH\_UTMP}] Specifica il registro per gli utenti correntemente
- collegati.
-\item[\const{\_PATH\_WTMP}] Specifica il registro per l'archivio storico degli
- utenti collegati.
+\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
+ è utilizzato \func{utmpname} per modificarlo.
+\item[\const{\_PATH\_WTMP}] specifica il file che contiene il registro per
+ l'archivio storico degli utenti collegati.
\end{basedescript}
-corrispondenti ai file \file{/var/run/utmp} e \file{/var/log/wtmp} visti in
-precedenza.
+che nel caso di Linux hanno un valore corrispondente ai file
+\file{/var/run/utmp} e \file{/var/log/wtmp} citati in precedenza.
-\begin{figure}[!htb]
- \footnotesize
- \centering
- \begin{minipage}[c]{15cm}
- \includestruct{listati/utmp.h}
- \end{minipage}
- \normalsize
- \caption{La struttura \structd{utmp} contenente le informazioni di una voce
- del registro di \textsl{contabilità}.}
- \label{fig:sys_utmp_struct}
-\end{figure}
-
-Una volta aperto il file si può eseguire una scansione leggendo o scrivendo
-una voce con le funzioni \funcd{getutent}, \funcd{getutid}, \funcd{getutline}
-e \funcd{pututline}, i cui prototipi sono:
+Una volta aperto il file del registro degli utenti si può eseguire una
+scansione leggendo o scrivendo una voce con le funzioni \funcd{getutent},
+\funcd{getutid}, \funcd{getutline} e \funcd{pututline}, i cui prototipi sono:
\begin{functions}
\headdecl{utmp.h}
voce dal registro; \func{getutent} legge semplicemente la prima voce
disponibile; le altre due permettono di eseguire una ricerca.
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/utmp.h}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \structd{utmp} contenente le informazioni di una voce
+ del registro di \textsl{contabilità}.}
+ \label{fig:sys_utmp_struct}
+\end{figure}
+
Con \func{getutid} si può cercare una voce specifica, a seconda del valore del
campo \var{ut\_type} dell'argomento \param{ut}. Questo può assumere i valori
riportati in tab.~\ref{tab:sys_ut_type}, quando assume i valori
Gli altri tre campi servono a quantificare l'uso della memoria
virtuale\index{memoria~virtuale} e corrispondono rispettivamente al numero di
-\textit{page fault}\itindex{page~fault} (vedi sez.~\ref{sec:proc_mem_gen})
+\itindex{page~fault} \textit{page fault} (vedi sez.~\ref{sec:proc_mem_gen})
avvenuti senza richiedere I/O su disco (i cosiddetti \textit{minor page
fault}), a quelli che invece han richiesto I/O su disco (detti invece
\textit{major page fault}) ed al numero di volte che il processo è stato
stack il processo riceverà un segnale di
\const{SIGSEGV}. \\
\const{RLIMIT\_CORE} & La massima dimensione per di un file di
- \textit{core dump}\itindex{core~dump} (vedi
+ \itindex{core~dump} \textit{core dump} (vedi
sez.~\ref{sec:sig_prog_error}) creato nella
terminazione di un processo; file di dimensioni
maggiori verranno troncati a questo valore,
mentre con un valore si bloccherà la creazione
- dei \textit{core dump}\itindex{core~dump}.\\
+ dei \itindex{core~dump} \textit{core dump}.\\
\const{RLIMIT\_CPU} & Il massimo tempo di CPU (vedi
sez.~\ref{sec:sys_cpu_times}) che il processo può
usare. Il superamento del limite corrente
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
+ \index{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
dei due limiti.} comporta o l'emissione di un segnale o il fallimento della
system call che lo ha provocato;\footnote{si nuovo c'è una eccezione per
\const{RLIMIT\_CORE} che influenza soltanto la dimensione (o l'eventuale
- creazione) dei file di \itindex{core~dump}\textit{core dump}.} per
+ creazione) dei file di \itindex{core~dump} \textit{core dump}.} per
permettere di leggere e di impostare i limiti di utilizzo delle risorse da
parte di un processo sono previste due funzioni, \funcd{getrlimit} e
\funcd{setrlimit}, i cui prototipi sono:
anche usare la costante \const{RLIM\_INFINITY} che permette di sbloccare l'uso
di una risorsa; ma si ricordi che solo un processo con i privilegi di
amministratore\footnote{per essere precisi in questo caso quello che serve è
- la \itindex{capabilities}\textit{capability} \const{CAP\_SYS\_RESOURCE}.}
+ la \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_RESOURCE}.}
può innalzare un limite al di sopra del valore corrente del limite massimo ed
usare un valore qualsiasi per entrambi i limiti. Si tenga conto infine che
tutti i limiti vengono ereditati dal processo padre attraverso una \func{fork}
La gestione della memoria è già stata affrontata in dettaglio in
sez.~\ref{sec:proc_memory}; abbiamo visto allora che il kernel provvede il
-meccanismo della memoria virtuale\index{memoria~virtuale} attraverso la
+meccanismo della \index{memoria~virtuale} memoria virtuale attraverso la
divisione della memoria fisica in pagine.
In genere tutto ciò è del tutto trasparente al singolo processo, ma in certi
che usa lo stesso meccanismo per accedere ai file, è necessario conoscere le
dimensioni delle pagine usate dal kernel. Lo stesso vale quando si vuole
gestire in maniera ottimale l'interazione della memoria che si sta allocando
-con il meccanismo della paginazione\index{paginazione}.
+con il meccanismo della \index{paginazione} paginazione.
Di solito la dimensione delle pagine di memoria è fissata dall'architettura
hardware, per cui il suo valore di norma veniva mantenuto in una costante che
\end{prototype}
La funzione restituisce in ciascun elemento di \param{loadavg} il numero medio
-di processi attivi sulla coda dello scheduler\itindex{scheduler}, calcolato su
-diversi intervalli di tempo. Il numero di intervalli che si vogliono
+di processi attivi sulla coda dello \itindex{scheduler} scheduler, calcolato
+su diversi intervalli di tempo. Il numero di intervalli che si vogliono
leggere è specificato da \param{nelem}, dato che nel caso di Linux il carico
viene valutato solo su tre intervalli (corrispondenti a 1, 5 e 15 minuti),
questo è anche il massimo valore che può essere assegnato a questo argomento.
dall'orologio hardware del calcolatore.
Anche il \itindex{process~time} \textit{process time} di solito si esprime in
-secondi, ma provvede una precisione ovviamente superiore al \textit{calendar
+secondi, ma fornisce una precisione ovviamente superiore al \textit{calendar
time} (che è mantenuto dal sistema con una granularità di un secondo) e
viene usato per tenere conto dei tempi di esecuzione dei processi. Per ciascun
processo il kernel calcola tre tempi diversi:
che errori relativi alla stessa linea non vengano ripetuti.
-
-
-%%% Local Variables:
-%%% mode: latex
-%%% TeX-master: "gapil"
-%%% End:
-
% LocalWords: filesystem like kernel saved header limits sysconf sez tab float
% LocalWords: FOPEN stdio MB LEN CHAR char UCHAR unsigned SCHAR MIN signed INT
% LocalWords: SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG
% LocalWords: strftime thread EOF modifiable lvalue app errcode strerror LC at
% LocalWords: perror string errnum MESSAGES error message ErrCode strtol log
% LocalWords: program invocation argv printf print progname exit count fname
-% LocalWords: lineno one standardese
+% LocalWords: lineno one standardese Di
+
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: