%% system.tex
%%
-%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2000-2010 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}
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{MB\_LEN\_MAX}& 16 & massima dimensione di un
- carattere esteso\\
- \const{CHAR\_BIT} & 8 & bit di \ctyp{char}\\
- \const{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\
- \const{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\
- \const{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\
- \const{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\
- \const{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\
- \const{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\
- \const{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\
- \const{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\
- \const{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\
- \const{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\
- \const{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\
- \const{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\
- \const{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\
- \const{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\
+ \const{MB\_LEN\_MAX}& 16 & Massima dimensione di un
+ carattere esteso.\\
+ \const{CHAR\_BIT} & 8 & Numero di bit di \ctyp{char}.\\
+ \const{UCHAR\_MAX}& 255 & Massimo di \ctyp{unsigned char}.\\
+ \const{SCHAR\_MIN}& -128 & Minimo di \ctyp{signed char}.\\
+ \const{SCHAR\_MAX}& 127 & Massimo di \ctyp{signed char}.\\
+ \const{CHAR\_MIN} &\footnotemark& Minimo di \ctyp{char}.\\
+ \const{CHAR\_MAX} &\footnotemark& Massimo di \ctyp{char}.\\
+ \const{SHRT\_MIN} & -32768 & Minimo di \ctyp{short}.\\
+ \const{SHRT\_MAX} & 32767 & Massimo di \ctyp{short}.\\
+ \const{USHRT\_MAX}& 65535 & Massimo di \ctyp{unsigned short}.\\
+ \const{INT\_MAX} & 2147483647 & Minimo di \ctyp{int}.\\
+ \const{INT\_MIN} &-2147483648 & Minimo di \ctyp{int}.\\
+ \const{UINT\_MAX} & 4294967295 & Massimo di \ctyp{unsigned int}.\\
+ \const{LONG\_MAX} & 2147483647 & Massimo di \ctyp{long}.\\
+ \const{LONG\_MIN} &-2147483648 & Minimo di \ctyp{long}.\\
+ \const{ULONG\_MAX}& 4294967295 & Massimo di \ctyp{unsigned long}.\\
\hline
\end{tabular}
\caption{Costanti definite in \file{limits.h} in conformità allo standard
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\
- \const{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\
+ \const{LLONG\_MAX}& 9223372036854775807& Massimo di \ctyp{long long}.\\
+ \const{LLONG\_MIN}&-9223372036854775808& Minimo di \ctyp{long long}.\\
\const{ULLONG\_MAX}&18446744073709551615&
- massimo di \ctyp{unsigned long long}\\
+ Massimo di \ctyp{unsigned long long}.\\
\hline
\end{tabular}
\caption{Macro definite in \file{limits.h} in conformità allo standard
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{ARG\_MAX} &131072& dimensione massima degli argomenti
+ \const{ARG\_MAX} &131072& Dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \const{CHILD\_MAX} & 999& numero massimo di processi contemporanei
+ \const{CHILD\_MAX} & 999& Numero massimo di processi contemporanei
che un utente può eseguire.\\
- \const{OPEN\_MAX} & 256& numero massimo di file che un processo
+ \const{OPEN\_MAX} & 256& Numero massimo di file che un processo
può mantenere aperti in contemporanea.\\
- \const{STREAM\_MAX}& 8& massimo numero di stream aperti per
+ \const{STREAM\_MAX}& 8& Massimo numero di stream aperti per
processo in contemporanea.\\
- \const{TZNAME\_MAX}& 6& dimensione massima del nome di una
+ \const{TZNAME\_MAX}& 6& Dimensione massima del nome di una
\texttt{timezone} (vedi
sez.~\ref{sec:sys_time_base})).\\
- \const{NGROUPS\_MAX}& 32& numero di gruppi supplementari per
+ \const{NGROUPS\_MAX}& 32& Numero di gruppi supplementari per
processo (vedi sez.~\ref{sec:proc_access_id}).\\
- \const{SSIZE\_MAX}&32767& valore massimo del tipo \type{ssize\_t}.\\
- \hline
+ \const{SSIZE\_MAX}&32767& Valore massimo del tipo \type{ssize\_t}.\\
\hline
\end{tabular}
\caption{Costanti per i limiti del sistema.}
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \const{\_POSIX\_ARG\_MAX} & 4096& dimensione massima degli argomenti
+ \const{\_POSIX\_ARG\_MAX} & 4096& Dimensione massima degli argomenti
passati ad una funzione della famiglia
\func{exec}.\\
- \const{\_POSIX\_CHILD\_MAX} & 6& numero massimo di processi
+ \const{\_POSIX\_CHILD\_MAX} & 6& Numero massimo di processi
contemporanei che un utente può
eseguire.\\
- \const{\_POSIX\_OPEN\_MAX} & 16& numero massimo di file che un processo
+ \const{\_POSIX\_OPEN\_MAX} & 16& Numero massimo di file che un processo
può mantenere aperti in
contemporanea.\\
- \const{\_POSIX\_STREAM\_MAX} & 8& massimo numero di stream aperti per
+ \const{\_POSIX\_STREAM\_MAX} & 8& Massimo numero di stream aperti per
processo in contemporanea.\\
- \const{\_POSIX\_TZNAME\_MAX} & & dimensione massima del nome di una
+ \const{\_POSIX\_TZNAME\_MAX} & & Dimensione massima del nome di una
\textit{timezone} (vedi
sez.~\ref{sec:sys_date}). \\
- \const{\_POSIX\_NGROUPS\_MAX}& 0& numero di gruppi supplementari per
+ \const{\_POSIX\_NGROUPS\_MAX}& 0& Numero di gruppi supplementari per
processo (vedi
sez.~\ref{sec:proc_access_id}).\\
- \const{\_POSIX\_SSIZE\_MAX} &32767& valore massimo del tipo
+ \const{\_POSIX\_SSIZE\_MAX} &32767& Valore massimo del tipo
\type{ssize\_t}.\\
\const{\_POSIX\_AIO\_LISTIO\_MAX}&2& \\
\const{\_POSIX\_AIO\_MAX} & 1& \\
\hline
- \hline
\end{tabular}
\caption{Macro dei valori minimi delle caratteristiche generali del sistema
per la conformità allo standard POSIX.1.}
\textbf{Macro}&\textbf{Significato}\\
\hline
\hline
- \macro{\_POSIX\_JOB\_CONTROL}& il sistema supporta il
+ \macro{\_POSIX\_JOB\_CONTROL}& Il sistema supporta il
\textit{job control} (vedi
sez.~\ref{sec:sess_job_control}).\\
- \macro{\_POSIX\_SAVED\_IDS} & il sistema supporta gli identificatori del
+ \macro{\_POSIX\_SAVED\_IDS} & Il sistema supporta gli identificatori del
gruppo \textit{saved} (vedi
sez.~\ref{sec:proc_access_id})
per il controllo di accesso dei processi\\
- \const{\_POSIX\_VERSION} & fornisce la versione dello standard POSIX.1
+ \const{\_POSIX\_VERSION} & Fornisce la versione dello standard POSIX.1
supportata nel formato YYYYMML (ad esempio
199009L).\\
\hline
Valore massimo del tipo di dato
\type{ssize\_t}.\\
\texttt{\_SC\_CLK\_TCK} & \const{CLK\_TCK} &
- Il numero di \textit{clock tick} al secondo,
+ Il numero di \itindex{clock~tick}
+ \textit{clock tick} al secondo,
cioè l'unità di misura del
\itindex{process~time} \textit{process
time} (vedi
\textbf{Costante}&\textbf{Valore}&\textbf{Significato}\\
\hline
\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{PIPE\_BUF}&4096 & byte scrivibili atomicamente in una pipe
+ \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{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{MAX\_CANON}&255 & Dimensione di una riga di terminale in modo
canonico (vedi sez.~\ref{sec:term_design}).\\
- \const{MAX\_INPUT}&255 & spazio disponibile nella coda di input
+ \const{MAX\_INPUT}&255 & Spazio disponibile nella coda di input
del terminale (vedi
sez.~\ref{sec:term_design}).\\
\hline
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \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}.\\
- \const{\_POSIX\_PIPE\_BUF}& 512 & byte scrivibili atomicamente in una
- pipe.\\
- \const{\_POSIX\_MAX\_CANON}&255 & dimensione di una riga di
- terminale in modo canonico.\\
- \const{\_POSIX\_MAX\_INPUT}&255 & spazio disponibile nella coda di input
- del terminale.\\
+ \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}.\\
+ \const{\_POSIX\_PIPE\_BUF}& 512 & Byte scrivibili atomicamente in una
+ pipe.\\
+ \const{\_POSIX\_MAX\_CANON}&255 & Dimensione di una riga di
+ terminale in modo canonico.\\
+ \const{\_POSIX\_MAX\_INPUT}&255 & Spazio disponibile nella coda di input
+ del terminale.\\
% \const{\_POSIX\_MQ\_OPEN\_MAX}& 8& \\
% \const{\_POSIX\_MQ\_PRIO\_MAX}& 32& \\
% \const{\_POSIX\_FD\_SETSIZE}& 16 & \\
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}.
\label{fig:sys_utsname}
\end{figure}
-In generale si tenga presente che le dimensioni delle stringe di una
-\struct{utsname} non è specificata, e che esse sono sempre terminate con NUL;
-il manuale delle \acr{glibc} indica due diverse dimensioni,
+In generale si tenga presente che le dimensioni delle stringhe di una
+struttura \struct{utsname} non è specificata, e che esse sono sempre terminate
+con NUL; il manuale delle \acr{glibc} indica due diverse dimensioni,
\const{\_UTSNAME\_LENGTH} per i campi standard e
\const{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
altri sistemi usano nomi diversi come \const{SYS\_NMLN} o \const{\_SYS\_NMLN}
-o \const{UTSLEN} che possono avere valori diversi.\footnote{Nel caso di Linux
+o \const{UTSLEN} che possono avere valori diversi.\footnote{nel caso di Linux
\func{uname} corrisponde in realtà a 3 system call diverse, le prime due
usano rispettivamente delle lunghezze delle stringhe di 9 e 65 byte; la
terza usa anch'essa 65 byte, ma restituisce anche l'ultimo campo,
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}
\subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}}
\label{sec:sys_sysctl}
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
disponibile in \file{/proc/sys} è riportata inoltre nella documentazione
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_config}) che sono
-mantenute nei file \file{ostype}, \file{hostname}, \file{osrelease},
-\file{version} e \file{domainname} di \file{/proc/kernel/}.
+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/}.
\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}.
- \item[\errcode{ENXIO}] il \textit{major number} del device \param{source} è
- sbagliato.
+ \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},
scrittura.
Il tipo di filesystem è specificato da \param{filesystemtype}, che deve essere
-una delle stringhe riportate nel file \file{/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.
+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
\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 i flag.\\
- \const{MS\_MANDLOCK} & 64 & consente il \textit{mandatory locking} (vedi
+ \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
+ \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
+ \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
+ \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.\\
+ \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.
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
Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
-file \file{/etc/fstab} ed \file{/etc/mtab}, che convenzionalmente sono usati
-in quasi tutti i sistemi unix-like per mantenere rispettivamente le
+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 \file{/etc/mtab}
-per inserire e rimuovere le voci presenti nel file.
+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 \file{/etc/mtab}), quando si debba scrivere un programma che
+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}
+%\label{sec:keyctl_management}
+
+
\subsection{La gestione delle informazioni su utenti e gruppi}
\label{sec:sys_user_group}
Tradizionalmente le informazioni utilizzate nella gestione di utenti e gruppi
(password, corrispondenze fra nomi simbolici e user-id, home directory, ecc.)
-venivano registrate all'interno dei due file di testo \file{/etc/passwd} ed
-\file{/etc/group},\footnote{in realtà oltre a questi nelle distribuzioni più
- recenti è stato introdotto il sistema delle \textit{shadow password} che
- prevede anche i due file \file{/etc/shadow} e \file{/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 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 richiedevano l'accesso a queste
-informazione andavano a leggere direttamente il contenuto di questi file.
+venivano registrate all'interno dei due file di testo \conffile{/etc/passwd}
+ed \conffile{/etc/group},\footnote{in realtà oltre a questi nelle
+ distribuzioni più recenti è stato introdotto il sistema delle \textit{shadow
+ password} che prevede anche i due file \conffile{/etc/shadow} e
+ \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
+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
+richiedevano l'accesso a queste informazione andavano a leggere direttamente
+il contenuto di questi file.
Col tempo però questa impostazione ha incominciato a mostrare dei limiti: da
una parte il meccanismo classico di autenticazione è stato ampliato, ed oggi
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.
motivo viene sovrascritta ad ogni nuova invocazione, lo stesso dicasi per la
memoria dove sono scritte le stringhe a cui i puntatori in essa contenuti
fanno riferimento. Ovviamente questo implica che dette funzioni non possono
-essere rientranti; per questo motivo ne esistono anche due versioni
-alternative (denotate dalla solita estensione \code{\_r}), i cui prototipi
-sono:
+essere \index{funzioni!rientranti} rientranti; per questo motivo ne esistono
+anche due versioni alternative (denotate dalla solita estensione \code{\_r}),
+i cui prototipi sono:
\begin{functions}
\headdecl{pwd.h}
impostato a \val{NULL}).
Del tutto analoghe alle precedenti sono le funzioni \funcd{getgrnam} e
-\funcd{getgrgid} (e le relative analoghe rientranti con la stessa estensione
-\code{\_r}) che permettono di leggere le informazioni relative ai gruppi, i
-loro prototipi sono:
+\funcd{getgrgid} (e le relative analoghe \index{funzioni!rientranti}
+rientranti con la stessa estensione \code{\_r}) che permettono di leggere le
+informazioni relative ai gruppi, i loro prototipi sono:
\begin{functions}
\headdecl{grp.h}
\headdecl{sys/types.h}
\end{figure}
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
-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 \file{/etc/passwd} e \file{/etc/group}.
+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}.
\begin{table}[htb]
\footnotesize
\hline
\func{fgetpwent} & Legge una voce dal file di registro degli utenti
specificato.\\
- \func{fgetpwent\_r}& Come la precedente, ma rientrante.\\
+ \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 \file{/etc/passwd}.\\
- \func{getpwent\_r} & Come la precedente, ma rientrante.\\
- \func{setpwent} & Ritorna all'inizio di \file{/etc/passwd}.\\
- \func{endpwent} & Chiude \file{/etc/passwd}.\\
+ \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 rientrante.\\
+ \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 \file{/etc/group}.\\
- \func{getgrent\_r} & Come la precedente, ma rientrante.\\
- \func{setgrent} & Ritorna all'inizio di \file{/etc/group}.\\
- \func{endgrent} & Chiude \file{/etc/group}.\\
+ \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}.\\
\hline
\end{tabular}
\caption{Funzioni per la manipolazione dei campi di un file usato come
- registro per utenti o gruppi nel formato di \file{/etc/passwd} e
- \file{/etc/groups}.}
+ registro per utenti o gruppi nel formato di \conffile{/etc/passwd} e
+ \conffile{/etc/group}.}
\label{tab:sys_passwd_func}
\end{table}
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 \file{/etc/passwd}), si tenga presente che le
+formato classico del file \conffile{/etc/passwd}), si tenga presente che le
funzioni di questa interfaccia che permettono di scrivere delle voci in un
\textsl{registro} degli utenti (cioè \func{putpwent} e \func{putgrent}) non
hanno la capacità di farlo specificando tutti i contenuti necessari rispetto a
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.
-
-\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}
+che nel caso di Linux hanno un valore corrispondente ai file
+\file{/var/run/utmp} e \file{/var/log/wtmp} citati in precedenza.
-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
\textbf{Valore} & \textbf{Significato}\\
\hline
\hline
- \const{EMPTY} & Non contiene informazioni valide. \\
- \const{RUN\_LVL} & Identica il runlevel del sistema. \\
- \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema \\
+ \const{EMPTY} & Non contiene informazioni valide.\\
+ \const{RUN\_LVL} & Identica il runlevel del sistema.\\
+ \const{BOOT\_TIME} & Identifica il tempo di avvio del sistema.\\
\const{OLD\_TIME} & Identifica quando è stato modificato l'orologio di
- sistema. \\
+ sistema.\\
\const{NEW\_TIME} & Identifica da quanto è stato modificato il
- sistema. \\
- \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}. \\
- \const{LOGIN\_PROCESS}& Identifica un processo di login. \\
- \const{USER\_PROCESS} & Identifica un processo utente. \\
- \const{DEAD\_PROCESS} & Identifica un processo terminato. \\
+ sistema.\\
+ \const{INIT\_PROCESS} & Identifica un processo lanciato da \cmd{init}.\\
+ \const{LOGIN\_PROCESS}& Identifica un processo di login.\\
+ \const{USER\_PROCESS} & Identifica un processo utente.\\
+ \const{DEAD\_PROCESS} & Identifica un processo terminato.\\
% \const{ACCOUNTING} & ??? \\
\hline
\end{tabular}
sinonimi delle funzioni appena viste.
Come visto in sez.~\ref{sec:sys_user_group}, l'uso di strutture allocate
-staticamente rende le funzioni di lettura non rientranti; per questo motivo le
-\acr{glibc} forniscono anche delle versioni rientranti: \func{getutent\_r},
-\func{getutid\_r}, \func{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 rientranti, solo che restituiscono
-il risultato all'indirizzo specificato dal primo argomento aggiuntivo (di tipo
-\code{struct utmp *buffer}) mentre il secondo (di tipo \code{struct utmp
- **result)} viene usato per restituire il puntatore allo stesso buffer.
+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
+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
+aggiuntivo (di tipo \code{struct utmp *buffer}) mentre il secondo (di tipo
+\code{struct utmp **result)} viene usato per restituire il puntatore allo
+stesso buffer.
Infine le \acr{glibc} forniscono come estensione per la scrittura delle voci
in \file{wmtp} altre due funzioni, \funcd{updwtmp} e \funcd{logwtmp}, i cui
\subsection{L'uso delle risorse}
\label{sec:sys_resource_use}
-Come abbiamo accennato in sez.~\ref{sec:proc_wait4} le informazioni riguardo
+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}.
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
necessario, ma aumenta la portabilità, e serve comunque quando, come nella
maggior parte dei casi, si debba accedere ai campi di \struct{rusage} relativi
ai tempi di utilizzo del processore, che sono definiti come strutture di tipo
-\struct{timeval}.
+\struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct}).
Questa è la stessa struttura utilizzata da \func{wait4} (si ricordi quando
-visto in sez.~\ref{sec:proc_wait4}) per ricavare la quantità di risorse
+visto in sez.~\ref{sec:proc_wait}) per ricavare la quantità di risorse
impiegate dal processo di cui si è letto lo stato di terminazione, ma essa può
anche essere letta direttamente utilizzando la funzione \funcd{getrusage}, il
cui prototipo è:
\const{RUSAGE\_CHILDREN} per indicare l'insieme dei processi figli di cui si è
ricevuto lo stato di terminazione.
+% TODO previsto in futuro \const{RUSAGE\_THREAD}, verificare.
\subsection{Limiti sulle risorse}
\label{sec:sys_resource_limit}
esse falliranno con un errore di
\errcode{ENOMEM}, mentre se il superamento viene
causato dalla crescita dello \itindex{stack}
- stack il processo riceverà un segnale di
- \const{SIGSEGV}. \\
+ \textit{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
comporta l'emissione di un segnale di
- \const{SIGXCPU} la cui azione predefinita (vedi
+ \const{SIGXCPU}, la cui azione predefinita (vedi
sez.~\ref{sec:sig_classification}) è terminare
- il processo. Il superamento del limite massimo
+ 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\\
\const{RLIMIT\_DATA} & La massima dimensione del \index{segmento!dati}
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
sez.~\ref{sec:ipc_sysv_shm}) che viene
contabilizzata separatamente ma sulla quale
viene applicato questo stesso limite.\\
+% TODO trattare i seguenti...
+% \const{RLIMIT\_MSGQUEUE}& Il numero massimo di \\
+% \const{RLIMIT\_NICE}& Il numero massimo di \\
+% \const{RLIMIT\_RTPRIO}& Il numero massimo di \\
+% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
+% vedi file include/asm-generic/resource.h
\const{RLIMIT\_NOFILE} & Il numero massimo di file che il processo può
aprire. L'apertura di un ulteriore file farà
fallire la funzione (\func{open}, \func{dup} o
si potrà sempre inviare un segnale che non sia
già presente su una coda.\footnotemark\\
\const{RLIMIT\_STACK} & La massima dimensione dello \itindex{stack}
- stack del
- processo. Se il processo esegue operazioni che
- estendano lo stack oltre questa dimensione
+ \textit{stack} del processo. Se il processo
+ esegue operazioni che estendano lo
+ \textit{stack} oltre questa dimensione
riceverà un segnale di \const{SIGSEGV}.\\
\const{RLIMIT\_RSS} & L'ammontare massimo di pagine di memoria dato al
\index{segmento!testo} testo del processo. Il
qualora ci fosse un surplus di memoria questa
verrebbe assegnata.\\
% TODO integrare con la roba di madvise
+% TODO integrare con le ultime aggiunte, vedi pagina di manuale
\hline
\end{tabular}
\caption{Valori possibili dell'argomento \param{resource} delle funzioni
\footnotetext[18]{questo è quanto avviene per i kernel dalla serie 2.2 fino ad
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 \const{SIGXCPU} e
- terminare in maniera ordinata il processo.}
+ operazioni portabili è sempre opportuno intercettare il primo
+ \const{SIGXCPU} e terminare in maniera ordinata il processo.}
\footnotetext{il limite su questa risorsa è stato introdotto con il kernel
2.6.8.}
+
In generale il superamento di un limite corrente\footnote{di norma quanto
riportato in tab.~\ref{tab:sys_rlimit_values} fa riferimento a quanto
avviene al superamento del limite corrente, con l'eccezione
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:
\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{EINVAL}] I valori per \param{resource} non sono validi.
- \item[\errcode{EPERM}] Un processo senza i privilegi di amministratore ha
+ \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi.
+ \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha
cercato di innalzare i propri limiti.
\end{errlist}
ed \errval{EFAULT}.}
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}.}
-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}
-(vedi sez.~\ref{sec:proc_fork}) e mantenuti per gli altri programmi eseguiti
-attraverso una \func{exec} (vedi sez.~\ref{sec:proc_exec}).
+ la \itindex{capabilities} \textit{capability} \const{CAP\_SYS\_RESOURCE}
+ (vedi sez.~\ref{sec:proc_capabilities}).} 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} (vedi sez.~\ref{sec:proc_fork})
+e mantenuti per gli altri programmi eseguiti attraverso una \func{exec} (vedi
+sez.~\ref{sec:proc_exec}).
\subsection{Le risorse di memoria e processore}
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.
\begin{errlist}
\item[\errcode{EACCESS}] non si hanno i permessi per accedere a
\param{pathname}.
- \item[\errcode{EPERM}] Il processo non ha privilegi sufficienti ad
+ \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
apposita struttura dati definita all'interno del kernel.
Il funzionamento di \func{acct} viene inoltre modificato da uno specifico
-parametro di sistema, modificabile attraverso \file{/proc/sys/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
+parametro di sistema, modificabile attraverso \procfile{/proc/sys/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
minimo indicato dal secondo valore (sempre in percentuale di spazio disco
libero). Infine l'ultimo valore indica la frequenza in secondi con cui deve
essere controllata detta percentuale.
+% TODO trattare quote disco
+% vedi man quotactl
+%\section{La gestione delle quote disco}
+%\label{sec:disk_quota}
Storicamente i sistemi unix-like hanno sempre mantenuto due distinti tipi di
dati per la misure dei tempi all'interno del sistema: essi sono
-rispettivamente chiamati \itindend{calendar~time} \textit{calendar time} e
+rispettivamente chiamati \itindex{calendar~time} \textit{calendar time} e
\itindex{process~time} \textit{process time}, secondo le definizioni:
\begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\textit{calendar time}] \itindend{calendar~time} detto anche
+\item[\textit{calendar time}] \itindex{calendar~time} detto anche
\textsl{tempo di calendario}. È il numero di secondi dalla mezzanotte del
primo gennaio 1970, in tempo universale coordinato (o UTC), data che viene
usualmente indicata con 00:00:00 Jan, 1 1970 (UTC) e chiamata \textit{the
le date di modifica dei file o quelle di avvio dei processi. Per memorizzare
questo tempo è stato riservato il tipo primitivo \type{time\_t}.
\item[\textit{process time}] \itindex{process~time} detto talvolta
- \textsl{tempo di processore}. Viene misurato in \textit{clock tick}. Un
- tempo questo corrispondeva al numero di interruzioni effettuate dal timer di
- sistema, adesso lo standard POSIX richiede che esso sia pari al valore della
- costante \const{CLOCKS\_PER\_SEC}, che deve essere definita come 1000000,
- qualunque sia la risoluzione reale dell'orologio di sistema e la frequenza
- delle interruzioni del timer.\footnote{quest'ultima, come accennato in
- sez.~\ref{sec:proc_hierarchy}, è invece data dalla costante \const{HZ}.}
- Il dato primitivo usato per questo tempo è \type{clock\_t}, che ha quindi
- una risoluzione del microsecondo. Il numero di 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 obsoleto.
+ \textsl{tempo di processore}. Viene misurato in \itindex{clock~tick}
+ \textit{clock tick}. Un tempo questo corrispondeva al numero di interruzioni
+ effettuate dal timer di sistema, adesso lo standard POSIX richiede che esso
+ sia pari al valore della costante \const{CLOCKS\_PER\_SEC}, che deve essere
+ definita come 1000000, qualunque sia la risoluzione reale dell'orologio di
+ sistema e la frequenza delle interruzioni del timer.\footnote{quest'ultima,
+ come accennato in sez.~\ref{sec:proc_hierarchy}, è invece data dalla
+ costante \const{HZ}.} Il dato primitivo usato per questo tempo è
+ \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
+ obsoleto.
\end{basedescript}
-In genere si usa il \itindend{calendar~time} \textit{calendar time} per
+In genere si usa il \itindex{calendar~time} \textit{calendar time} per
esprimere le date dei file e le informazioni analoghe che riguardano i
cosiddetti \textsl{tempi di orologio}, che vengono usati ad esempio per i
demoni che compiono lavori amministrativi ad ore definite, come \cmd{cron}.
Di solito questo tempo viene convertito automaticamente dal valore in UTC al
tempo locale, utilizzando le opportune informazioni di localizzazione
-(specificate in \file{/etc/timezone}). E da tenere presente che questo tempo è
-mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
+(specificate in \conffile{/etc/timezone}). E da tenere presente che questo
+tempo è mantenuto dal sistema e non è detto che corrisponda al tempo tenuto
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:
\itindbeg{process~time}
Di norma tutte le operazioni del sistema fanno sempre riferimento al
-\itindend{calendar~time} \textit{calendar time}, l'uso del \textit{process
+\itindex{calendar~time} \textit{calendar time}, l'uso del \textit{process
time} è riservato a quei casi in cui serve conoscere i tempi di esecuzione
di un processo (ad esempio per valutarne l'efficienza). In tal caso infatti
fare ricorso al \textit{calendar time} è inutile in quanto il tempo può essere
caso di errore.}
\end{prototype}
-La funzione restituisce il tempo in tick, quindi se si vuole il tempo in
-secondi occorre dividere il risultato per la costante
-\const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard ANSI C,
- POSIX richiede che \const{CLOCKS\_PER\_SEC} sia definito pari a 1000000
- indipendentemente dalla risoluzione del timer di sistema.} In genere
+La funzione restituisce il tempo in \itindex{clock~tick} \texttt{clock tick},
+quindi se si vuole il tempo in secondi occorre dividere il risultato per la
+costante \const{CLOCKS\_PER\_SEC}.\footnote{le \acr{glibc} seguono lo standard
+ ANSI C, POSIX richiede che \const{CLOCKS\_PER\_SEC} sia definito pari a
+ 1000000 indipendentemente dalla risoluzione del timer di sistema.} In genere
\type{clock\_t} viene rappresentato come intero a 32 bit, il che comporta un
valore massimo corrispondente a circa 72 minuti, dopo i quali il contatore
riprenderà lo stesso valore iniziale.
\begin{prototype}{sys/times.h}{clock\_t times(struct tms *buf)}
Legge in \param{buf} il valore corrente dei tempi di processore.
- \bodydesc{La funzione ritorna il numero di clock tick dall'avvio del sistema
- in caso di successo e -1 in caso di errore.}
+ \bodydesc{La funzione ritorna il numero di \itindex{clock~tick}
+ \textit{clock tick} dall'avvio del sistema in caso di successo e -1 in
+ caso di errore.}
\end{prototype}
La funzione restituisce i valori di \textit{process time} del processo
\itindbeg{calendar~time}
Come anticipato in sez.~\ref{sec:sys_unix_time} il \textit{calendar time} è
-mantenuto dal kernel in una variabile di tipo \type{time\_t}, che usualmente
+mantenuto dal kernel in una variabile di tipo \type{time\_t},\footnote{in
+ realtà il kernel usa una rappresentazione interna di che fornisce una
+ precisione molto maggiore, e consente per questo anche di usare
+ rappresentazioni diverse del \textit{calendar time}.} che usualmente
corrisponde ad un tipo elementare (in Linux è definito come \ctyp{long int},
che di norma corrisponde a 32 bit). Il valore corrente del \textit{calendar
time}, che indicheremo come \textsl{tempo di sistema}, può essere ottenuto
\errval{EPERM}.}
\end{functions}
-Queste funzioni utilizzano una struttura di tipo \struct{timeval}, la cui
-definizione, insieme a quella della analoga \struct{timespec}, è riportata in
-fig.~\ref{fig:sys_timeval_struct}. Le \acr{glibc} infatti forniscono queste due
-rappresentazioni alternative del \textit{calendar time} che rispetto a
-\type{time\_t} consentono rispettivamente precisioni del microsecondo e del
-nanosecondo.\footnote{la precisione è solo teorica, la precisione reale della
- misura del tempo dell'orologio di sistema non dipende dall'uso di queste
- strutture.}
-
-\begin{figure}[!htb]
- \footnotesize \centering
- \begin{minipage}[c]{15cm}
- \includestruct{listati/timeval.h}
- \end{minipage}
- \normalsize
- \caption{Le strutture \structd{timeval} e \structd{timespec} usate per una
- rappresentazione ad alta risoluzione del \textit{calendar time}.}
- \label{fig:sys_timeval_struct}
-\end{figure}
+Si noti come queste funzioni utilizzino per indicare il tempo una struttura di
+tipo \struct{timeval}, la cui definizione si è già vista in
+fig.~\ref{fig:sys_timeval_struct}, questa infatti permette una espressione
+alternativa dei valori del \textit{calendar time}, con una precisione,
+rispetto a \type{time\_t}, fino al microsecondo.\footnote{la precisione è solo
+ teorica, la precisione reale della misura del tempo dell'orologio di sistema
+ non dipende dall'uso di queste strutture.}
Come nel caso di \func{stime} anche \func{settimeofday} (la cosa continua a
valere per qualunque funzione che vada a modificare l'orologio di sistema,
PLL implementato dal kernel,
specificato nel campo
\var{constant} di \struct{timex}.\\
- \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei tick del timer
- in microsecondi, espresso nel campo
- \var{tick} di \struct{timex}.\\
+ \const{ADJ\_TICK} & 0x4000 & Imposta il valore dei \textit{tick}
+ \itindex{clock~tick} del timer in
+ microsecondi, espresso nel campo
+ \var{tick} di \struct{timex}.\\
\const{ADJ\_OFFSET\_SINGLESHOT}&0x8001&Imposta uno spostamento una tantum
dell'orologio secondo il valore del
campo \var{offset} simulando il
\hline
\hline
\const{TIME\_OK} & 0 & L'orologio è sincronizzato.\\
- \const{TIME\_INS} & 1 & insert leap second.\\
- \const{TIME\_DEL} & 2 & delete leap second.\\
- \const{TIME\_OOP} & 3 & leap second in progress.\\
- \const{TIME\_WAIT} & 4 & leap second has occurred.\\
+ \const{TIME\_INS} & 1 & Insert leap second.\\
+ \const{TIME\_DEL} & 2 & Delete leap second.\\
+ \const{TIME\_OOP} & 3 & Leap second in progress.\\
+ \const{TIME\_WAIT} & 4 & Leap second has occurred.\\
\const{TIME\_BAD} & 5 & L'orologio non è sincronizzato.\\
\hline
\end{tabular}
e impostano anche la variabile \var{tzname} con l'informazione della
\textit{time zone} corrente; \func{ctime} è banalmente definita in termini di
\func{asctime} come \code{asctime(localtime(t)}. Dato che l'uso di una stringa
-statica rende le funzioni non rientranti POSIX.1c e SUSv2 prevedono due
-sostitute rientranti, il cui nome è al solito ottenuto aggiungendo un
-\code{\_r}, che prendono un secondo argomento \code{char *buf}, in cui
-l'utente deve specificare il buffer su cui la stringa deve essere copiata
-(deve essere di almeno 26 caratteri).
+statica rende le funzioni non \index{funzioni!rientranti} rientranti POSIX.1c
+e SUSv2 prevedono due sostitute \index{funzioni!rientranti} rientranti, il cui
+nome è al solito ottenuto aggiungendo un \code{\_r}, che prendono un secondo
+argomento \code{char *buf}, in cui l'utente deve specificare il buffer su cui
+la stringa deve essere copiata (deve essere di almeno 26 caratteri).
Le altre tre funzioni, \func{gmtime}, \func{localtime} e \func{mktime} servono
per convertire il tempo dal formato \type{time\_t} a quello di \struct{tm} e
Anche in questo caso le prime due funzioni restituiscono l'indirizzo di una
struttura allocata staticamente, per questo sono state definite anche altre
-due versioni rientranti (con la solita estensione \code{\_r}), che prevedono
-un secondo argomento \code{struct tm *result}, fornito dal chiamante, che deve
-preallocare la struttura su cui sarà restituita la conversione.
+due versioni \index{funzioni!rientranti} rientranti (con la solita estensione
+\code{\_r}), che prevedono un secondo argomento \code{struct tm *result},
+fornito dal chiamante, che deve preallocare la struttura su cui sarà
+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
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 \file{/etc/localtime}.
+verrà usato il file \conffile{/etc/localtime}.
\begin{figure}[!htb]
\footnotesize
semplicemente usando un opportuno valore di ritorno della funzione invocata.
Inoltre il sistema di classificazione degli errori è basato sull'architettura
a processi, e presenta una serie di problemi nel caso lo si debba usare con i
-thread.
+\itindex{thread} \textit{thread}.
\subsection{La variabile \var{errno}}
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 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 thread.} definita nell'header \file{errno.h}; la
+\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}
per un esempio, ricordando quanto trattato in sez.~\ref{sec:proc_race_cond}),
programma; essa è utilizzabile solo fino ad una chiamata successiva a
\func{strerror} o \func{perror}, nessun'altra funzione di libreria tocca
questa stringa. In ogni caso l'uso di una stringa statica rende la funzione
-non rientrante, per cui nel caso si usino i 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 (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 rientrante \func{strerror\_r}, il cui
-prototipo è:
+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
+ (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 è:
\begin{prototype}{string.h}
{char * strerror\_r(int errnum, char *buf, size\_t size)}
\noindent
La funzione è analoga a \func{strerror} ma restituisce la stringa di errore
-nel buffer \param{buf} che il singolo thread deve allocare autonomamente per
-evitare i problemi connessi alla condivisione del buffer statico. Il messaggio
-è copiato fino alla dimensione massima del buffer, specificata dall'argomento
+nel buffer \param{buf} che il singolo \itindex{thread} \textit{thread} deve
+allocare autonomamente per evitare i problemi connessi alla condivisione del
+buffer statico. Il messaggio è copiato fino alla dimensione massima del
+buffer, specificata dall'argomento
\param{size}, che deve comprendere pure il carattere di terminazione;
altrimenti la stringa viene troncata.
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 page Wed Wednesday Apr April PM AM
+
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End:
+% LocalWords: CEST