\hline
\macro{MB\_LEN\_MAX}& 16 & massima dimensione di un
carattere esteso\\
- \macro{CHAR\_BIT} & 8 & bit di \type{char}\\
- \macro{UCHAR\_MAX}& 255 & massimo di \type{unsigned char}\\
- \macro{SCHAR\_MIN}& -128 & minimo di \type{signed char}\\
- \macro{SCHAR\_MAX}& 127 & massimo di \type{signed char}\\
- \macro{CHAR\_MIN} &\footnotemark& minimo di \type{char}\\
- \macro{CHAR\_MAX} &\footnotemark& massimo di \type{char}\\
- \macro{SHRT\_MIN} & -32768 & minimo di \type{short}\\
- \macro{SHRT\_MAX} & 32767 & massimo di \type{short}\\
- \macro{USHRT\_MAX}& 65535 & massimo di \type{unsigned short}\\
- \macro{INT\_MAX} & 2147483647 & minimo di \type{int}\\
- \macro{INT\_MIN} &-2147483648 & minimo di \type{int}\\
- \macro{UINT\_MAX} & 4294967295 & massimo di \type{unsigned int}\\
- \macro{LONG\_MAX} & 2147483647 & massimo di \type{long}\\
- \macro{LONG\_MIN} &-2147483648 & minimo di \type{long}\\
- \macro{ULONG\_MAX}& 4294967295 & massimo di \type{unsigned long}\\
+ \macro{CHAR\_BIT} & 8 & bit di \ctyp{char}\\
+ \macro{UCHAR\_MAX}& 255 & massimo di \ctyp{unsigned char}\\
+ \macro{SCHAR\_MIN}& -128 & minimo di \ctyp{signed char}\\
+ \macro{SCHAR\_MAX}& 127 & massimo di \ctyp{signed char}\\
+ \macro{CHAR\_MIN} &\footnotemark& minimo di \ctyp{char}\\
+ \macro{CHAR\_MAX} &\footnotemark& massimo di \ctyp{char}\\
+ \macro{SHRT\_MIN} & -32768 & minimo di \ctyp{short}\\
+ \macro{SHRT\_MAX} & 32767 & massimo di \ctyp{short}\\
+ \macro{USHRT\_MAX}& 65535 & massimo di \ctyp{unsigned short}\\
+ \macro{INT\_MAX} & 2147483647 & minimo di \ctyp{int}\\
+ \macro{INT\_MIN} &-2147483648 & minimo di \ctyp{int}\\
+ \macro{UINT\_MAX} & 4294967295 & massimo di \ctyp{unsigned int}\\
+ \macro{LONG\_MAX} & 2147483647 & massimo di \ctyp{long}\\
+ \macro{LONG\_MIN} &-2147483648 & minimo di \ctyp{long}\\
+ \macro{ULONG\_MAX}& 4294967295 & massimo di \ctyp{unsigned long}\\
\hline
\end{tabular}
\caption{Costanti definite in \file{limits.h} in conformità allo standard
a seconda che il sistema usi caratteri con segno o meno.}
A questi valori lo standard ISO C90 ne aggiunge altri tre, relativi al tipo
-\type{long long} introdotto con il nuovo standard, i relativi valori sono in
+\ctyp{long long} introdotto con il nuovo standard, i relativi valori sono in
\tabref{tab:sys_isoc90_macro}.
\begin{table}[htb]
\textbf{Macro}&\textbf{Valore}&\textbf{Significato}\\
\hline
\hline
- \macro{LLONG\_MAX}& 9223372036854775807& massimo di \type{long long}\\
- \macro{LLONG\_MIN}&-9223372036854775808& minimo di \type{long long}\\
+ \macro{LLONG\_MAX}& 9223372036854775807& massimo di \ctyp{long long}\\
+ \macro{LLONG\_MIN}&-9223372036854775808& minimo di \ctyp{long long}\\
\macro{ULLONG\_MAX}&18446744073709551615&
- massimo di \type{unsigned long long}\\
+ massimo di \ctyp{unsigned long long}\\
\hline
\end{tabular}
\caption{Macro definite in \file{limits.h} in conformità allo standard
\hline
\hline
\end{tabular}
- \caption{Macro .}
+ \caption{Costanti per i limiti del sistema.}
\label{tab:sys_generic_macro}
\end{table}
In generale si dovrebbe fare uso di \func{sysconf} solo quando la relativa
macro non è definita, quindi con un codice analogo al seguente:
-\footnotesize
+%\footnotesize
\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
get_child_max(void)
{
return val;
}
\end{lstlisting}
-\normalsize
+%\normalsize
ma in realtà in Linux queste macro sono comunque definite e indicando un
limite generico, per cui è sempre meglio usare i valori restituiti da
quest'ultima.
La funzione, che viene usata dal comando \cmd{uname}, restituisce le
informazioni richieste nella struttura \param{info}; anche questa struttura è
-definita in \file{sys/utsname.h} come:
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
-struct utsname {
- char sysname[_UTSNAME_LENGTH];
- char nodename[_UTSNAME_LENGTH];
- char release[_UTSNAME_LENGTH];
- char version[_UTSNAME_LENGTH];
- char machine[_UTSNAME_LENGTH];
-#ifdef _GNU_SOURCE
- char domainname[_UTSNAME_DOMAIN_LENGTH];
-#endif
-};
-\end{lstlisting}
-e le informazioni memorizzate nei suoi membri indicano rispettivamente:
+definita in \file{sys/utsname.h}, secondo quanto mostrato in
+\secref{fig:sys_utsname}, e le informazioni memorizzate nei suoi membri
+indicano rispettivamente:
\begin{itemize*}
\item il nome del sistema operativo;
\item il nome della release del kernel;
\item il nome della stazione;
\item il nome del domino.
\end{itemize*}
-(l'ultima informazione è stata aggiunta di recente e non è prevista dallo
-standard POSIX).
+l'ultima informazione è stata aggiunta di recente e non è prevista dallo
+standard POSIX, essa è accessibile, come mostrato in \figref{fig:sig_stack_t},
+solo definendo \macro{\_GNU\_SOURCE}.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct utsname {
+ char sysname[];
+ char nodename[];
+ char release[];
+ char version[];
+ char machine[];
+#ifdef _GNU_SOURCE
+ char domainname[];
+#endif
+};
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \var{utsname}.}
+ \label{fig:sys_utsname}
+\end{figure}
+
+In generale si tenga presente che le dimensioni delle stringe di una
+\var{utsname} non è specificata, e che esse sono sempre terminate con
+\macro{NULL}; il manuale delle \acr{glibc} indica due diverse dimensioni,
+\macro{\_UTSNAME\_LENGTH} per i campi standard e
+\macro{\_UTSNAME\_DOMAIN\_LENGTH} per quello specifico per il nome di dominio;
+altri sistemi usano nomi diversi come \macro{SYS\_NMLN} or \macro{\_SYS\_NMLN}
+or \macro{UTSLEN} che possono avere valori diversi; nel caso di Linux
+\func{uname} corrisponde in realtà a 3 system call diverse, le prime due usano
+delle lunghezze delle stringhe di 9 e 65 byte; la terza 65, restituisce anche
+l'ultimo campo con una lunghezza di 257 byte.
\section{Opzioni e configurazione del sistema}
sequenza dei vari nodi da attraversare. Ogni parametro ha un valore in un
formato specifico chee può essere un intero, una stringa o anche una struttura
complessa, per questo motivo il valori vengono passati come puntatori
-\type{void}.
+\ctyp{void}.
L'indirizzo a cui il valore corrente del parametro deve essere letto è
specificato da \param{oldvalue}, e lo spazio ivi disponibile è specificato da
accessibili i vari parametri a qualunque comando di shell e di permettere la
navigazione dell'albero dei valori.
-Alcune delle corrispondenze con i valori di \func{sysctl} sono riportate nei
-commenti in \file{linux/sysctl.h}, la informazione disponibile in
-\file{/proc/sys} è riportata inoltre nella documentazione inclusa nei sorgenti
-del kernel, nella directory \file{Documentation/sysctl}.
+Alcune delle corrispondenze dei file presentin \file{/proc/sys} con i valori
+di \func{sysctl} sono riportate nei commenti del codice che può essere trovato
+in \file{linux/sysctl.h},\footnote{indicando un file di definizioni si fa
+ riferimento alla directory standard dei file di include, che in ogni
+ distribuzione che si rispetti è \file{/usr/include}.} la informazione
+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 \secref{sec:sys_config}) che sono
+mantenute nei file \file{ostype}, \file{hostname}, \file{osrelease},
+\file{version} e \file{domainname} di \file{/proc/kernel/}.
+
\subsection{La gestione delle proprietà dei filesystem}
\item[\macro{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
- \type{mount point} o di spostarlo quando \param{target} non è un
- \type{mount point} o è \file{/}.
+ \textit{mount point} o di spostarlo quando \param{target} non è un
+ \textit{mount point} o è \file{/}.
\item[\macro{EACCES}] non si ha il permesso di accesso su uno dei componenti
del pathname, o si è cercato di montare un filesystem disponibile in sola
lettura senza averlo specificato o il device \param{source} è su un
valori riportati in \ntab.
\begin{table}[htb]
+ \footnotesize
\centering
\begin{tabular}[c]{|l|r|l|}
\hline
informazioni riguardo al filesystem su cui si trova un certo file, sono
\func{statfs} e \func{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.
+ \headdecl{sys/vfs.h}
+ \funcdecl{int statfs(const char *path, struct statfs *buf)}
+
+ \funcdecl{int fstatfs(int fd, struct statfs *buf)}
- \bodydesc{Li funzioni restituiscono 0 in caso di successo e -1 in caso di
+ 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} viene settato ai valori:
\begin{errlist}
\item[\macro{ENOSYS}] il filesystem su cui si trova il file specificato non
Queste funzioni permettono di ottenere una serie di informazioni generali
riguardo al filesystem su cui si trova il file specificato; queste vengono
-restituite una struttura \param{buf} definita come:
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+restituite una struttura \param{buf} di tipo \type{statfs} definita come in
+\ref{fig:sys_statfs}, ed i campi che sono indefiniti per il filesystem in
+esame sono settati 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 \macro{XXX\_SUPER\_MAGIC}, dove \macro{XXX} in genere è il
+nome del filesystem stesso.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
struct statfs {
long f_type; /* tipo di filesystem */
long f_bsize; /* dimensione ottimale dei blocchi di I/O */
long f_spare[6]; /* riservati per uso futuro */
};
\end{lstlisting}
-ed i campi che sono indefiniti per il filesystem in esame sono settati 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
-\macro{XXX\_SUPER\_MAGIC}, dove \macro{XXX} in genere è il nome del filesystem
-stesso.
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \var{statfs}.}
+ \label{fig:sys_statfs}
+\end{figure}
+
Le \acr{glibc} provvedono infine una serie di funzioni per la gestione dei due
file standard \file{/etc/fstab} e \file{/etc/mtab}, che convenzionalmente sono
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{libc} per la documentazione completa.
+\cite{glibc} per la documentazione completa.
\subsection{La gestione di utenti e gruppi}
oggi la maggior parte delle distribuzioni di Linux usa la libreria PAM (sigla
che sta \textit{Pluggable Authentication Method}) che permette di separare
completamente i meccanismi di gestione degli utenti (autenticazione,
-riconoscimeto, ecc.) dal
+riconoscimento, ecc.) dalle modalità in cui i relativi dati vengono mantenuti.
+In questo paragrafo ci limiteremo comunque alle funzioni classiche per la
+lettura delle informazioni relative a utenti e gruppi previste dallo standard
+POSIX.1, che fanno riferimento a quanto memorizzato nei due file appena
+citati, il cui formato è descritto dalle relative pagine del manuale (cioè
+\cmd{man 5 passwd} e \cmd{man 5 group}).
+Per leggere le informazioni relative ad un utente si possono usare due
+funzioni, \func{getpwuid} e \func{getpwnam}, i cui prototipi sono:
+\begin{functions}
+ \headdecl{pwd.h}
+ \headdecl{sys/types.h}
+ \funcdecl{struct passwd *getpwuid(uid\_t uid)}
+
+ \funcdecl{struct passwd *getpwnam(const char *name)}
-Lo standard POSIX.1 definisce una serie di funzioni
+ Restituiscono le informazioni relative alll'utente specificato.
+
+ \bodydesc{Le funzioni ritornano il puntatore alla struttura contenente le
+ informazioni in caso di successo e \macro{NULL} in caso di errore, nel
+ qual caso \var{errno} viene settata ad \macro{ENOMEM}.}
+\end{functions}
+Le due funzioni forniscono le informazioni memorizzate nel database 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
+login, restituendo un puntatore ad una struttura di tipo \type{passwd}, (la
+cui definizione è riportata in \figref{fig:sys_passwd_struct}), allocata
+staticamente.
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct passwd {
+ char *pw_name; /* user name */
+ char *pw_passwd; /* user password */
+ uid_t pw_uid; /* user id */
+ gid_t pw_gid; /* group id */
+ char *pw_gecos; /* real name */
+ char *pw_dir; /* home directory */
+ char *pw_shell; /* shell program */
+};
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \var{passwd} contenente le informazioni relative ad un
+ utente del sistema.}
+ \label{fig:sys_passwd_struct}
+\end{figure}
+
+
+\begin{figure}[!htb]
+ \footnotesize
+ \centering
+ \begin{minipage}[c]{15cm}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
+struct group {
+ char *gr_name; /* group name */
+ char *gr_passwd; /* group password */
+ gid_t gr_gid; /* group id */
+ char **gr_mem; /* group members */
+};
+ \end{lstlisting}
+ \end{minipage}
+ \normalsize
+ \caption{La struttura \var{passwd} contenente le informazioni relative ad un
+ utente del sistema.}
+ \label{fig:sys_passwd_struct}
+\end{figure}
\section{Limitazione ed uso delle risorse}
In questa sezione esamineremo le funzioni che permettono di esaminare e
controllare come le varie risorse del sistema (CPU, memoria, ecc.) vengono
-utilizzate dai processi, e le modalità con cui è possibile imporre dei limiti
-sul loro utilizzo.
+utilizzate dai singoli processi, e le modalità con cui è possibile imporre dei
+limiti sul loro utilizzo.
-
\subsection{Limiti sulle risorse}
\label{sec:sys_resource_limit}
\footnotesize
\centering
\begin{minipage}[c]{15cm}
- \begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
+ \begin{lstlisting}[labelstep=0]{}%,frame=,indent=1cm]{}
struct rusage {
struct timeval ru_utime; /* user time used */
struct timeval ru_stime; /* system time used */
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
-variabile è in genere definita come \type{volatile} dato che può essere
-cambiata in modo asincrono da un segnale (per una descrizione dei segnali si
-veda \secref{cha:signals}), ma dato che un manipolatore di segnale scritto
-bene salva e ripristina il valore della variabile, di questo non è necessario
-preoccuparsi nella programmazione normale.
+variabile è in genere definita come \ctyp{volatile} dato che può essere
+cambiata in modo asincrono da un segnale (si veda \ref{sec:sig_sigchld} per un
+esempio, ricordando quanto trattato in \ref{sec:proc_race_cond}), ma dato che
+un manipolatore di segnale scritto bene salva e ripristina il valore della
+variabile, di questo non è necessario preoccuparsi nella programmazione
+normale.
I valori che può assumere \var{errno} sono riportati in \capref{cha:errors},
nell'header \file{errno.h} sono anche definiti i nomi simbolici per le