\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
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
\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,
\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
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}
\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 \conffile{/etc/passwd}.\\
- \func{getpwent\_r} & Come la precedente, ma rientrante.\\
+ \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 \conffile{/etc/group}.\\
- \func{getgrent\_r} & Come la precedente, ma rientrante.\\
+ \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
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
\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
+ \textit{stack} il processo riceverà un segnale di
\const{SIGSEGV}.\\
\const{RLIMIT\_CORE} & La massima dimensione per di un file di
\itindex{core~dump} \textit{core dump} (vedi
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
\footnotetext{il limite su questa risorsa è stato introdotto con il kernel
2.6.8.}
+% aggiungere i limiti che mancano come RLIMIT_RTTIME introdotto con il 2.6.25
+% vedi file include/asm-generic/resource.h
+
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
\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}.}
\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
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
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
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
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
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.
% 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 Di
+% LocalWords: lineno one standardese Di page Wed Wednesday Apr April PM AM
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
+% LocalWords: CEST