X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=system.tex;h=797f953cc9b1165a6bedc7c5a60c5bbd8a664000;hp=41f43d92431cfd774b59c543e3c387b9905339d6;hb=b2fde72b2f308cb35873f1fd050501af6a742bc0;hpb=6ca77550fb420b3948b95a60ff79f7e282c12d34 diff --git a/system.tex b/system.tex index 41f43d9..797f953 100644 --- a/system.tex +++ b/system.tex @@ -1020,9 +1020,9 @@ La struttura usata da entrambe le funzioni 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} @@ -1053,9 +1053,9 @@ funzione fallir 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} @@ -1116,19 +1116,23 @@ file di \textsl{registro} di utenti e gruppi, con il formato classico di \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 @@ -1330,14 +1334,16 @@ gestione (\func{getutxent}, \func{getutxid}, \func{getutxline}, 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 @@ -1477,7 +1483,7 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard 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 @@ -1539,9 +1545,9 @@ fatto solo fino al valore del secondo, che per questo viene detto \textit{hard 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 @@ -2283,11 +2289,11 @@ stringa, allocata staticamente, nella forma: 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 @@ -2297,9 +2303,10 @@ locale; \func{mktime} esegue la conversione inversa. 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 @@ -2427,7 +2434,7 @@ un errore nell'esecuzione di una funzione, ma di norma questo viene riportato 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}} @@ -2445,10 +2452,11 @@ che c' 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 + 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}), @@ -2508,13 +2516,14 @@ La funzione utilizza una stringa statica che non deve essere modificata dal 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)} @@ -2534,9 +2543,10 @@ prototipo \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.