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}
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}
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
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 */