Piccole correzioni e completata la parte sui limiti aggiungendo
authorSimone Piccardi <piccardi@gnulinux.it>
Mon, 9 Apr 2012 19:38:07 +0000 (19:38 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Mon, 9 Apr 2012 19:38:07 +0000 (19:38 +0000)
prlimit.

prochand.tex
system.tex

index b0144e78a298712eafbeabef0e671ea47b9a03c3..9677726cc2be3bda16d335563d4367e08cab970d 100644 (file)
@@ -1127,9 +1127,10 @@ tradizionalmente gli 8 bit meno significativi sono riservati per memorizzare
 lo \itindex{exit~status} stato di uscita del processo, e gli altri per
 indicare il segnale che ha causato la terminazione (in caso di conclusione
 anomala), uno per indicare se è stato generato un \itindex{core~dump}
-\textit{core dump}, ecc.\footnote{le definizioni esatte si possono trovare in
-  \file{<bits/waitstatus.h>} ma questo file non deve mai essere usato
-  direttamente, esso viene incluso attraverso \file{<sys/wait.h>}.}
+\textit{core dump} (vedi sez.~\ref{sec:sig_standard}), ecc.\footnote{le
+  definizioni esatte si possono trovare in \file{<bits/waitstatus.h>} ma
+  questo file non deve mai essere usato direttamente, esso viene incluso
+  attraverso \file{<sys/wait.h>}.}
 
 \begin{table}[!htb]
   \centering
@@ -1318,8 +1319,8 @@ campi:
   \const{CLD\_STOPPED}, \const{CLD\_CONTINUED}, \const{CLD\_TRAPPED} e
   \const{CLD\_DUMPED} a indicare la ragione del ritorno della funzione, il cui
   significato è, nell'ordine: uscita normale, terminazione da segnale,
-  processo fermato, processo riavviato, processo terminato in \textit{core
-    dump}.
+  processo fermato, processo riavviato, processo terminato in
+  \itindex{core~dump} \textit{core dump} (vedi sez.~\ref{sec:sig_standard}).
 \end{basedescript}
 
 Infine Linux, seguendo un'estensione di BSD, supporta altre due funzioni per
index 5ad544dd23970ac3c0d5a0d08503f2c09811dbaa..313aceb9d83dabc013867276f8214210b95dc32a 100644 (file)
@@ -20,7 +20,7 @@ quelle per la gestione ed il controllo dei filesystem, degli utenti, dei tempi
 e degli errori.
 
 
-\section{La gestione di catteristiche e parametri del sistema}
+\section{La gestione di caratteristiche e parametri del sistema}
 \label{sec:sys_characteristics}
 
 In questa sezione tratteremo le varie modalità con cui un programma può
@@ -883,7 +883,7 @@ sistema del \itindex{Name~Service~Switch~(NSS)} \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 alle funzioni della libreria PAM, ma questo non è un
-  argomento che trattremo qui.} Dato che POSIX non prevede questa possibilità
+  argomento che tratteremo qui.} 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 interfaccia però funziona
 soltanto quando le informazioni sono mantenute su un apposito file di
@@ -1048,7 +1048,7 @@ fig.~\ref{fig:sys_utmp_struct}. Le prime tre funzioni servono per leggere una
 voce dal registro: \func{getutent} legge semplicemente la prima voce
 disponibile, le altre due permettono di eseguire una ricerca. Aprendo il
 registro con \func{setutent} ci si posiziona al suo inizio, ogni chiamata di
-queste funzioni eseguirà la lettura sulle voci seguenti, portanto la posizione
+queste funzioni eseguirà la lettura sulle voci seguenti, pertanto la posizione
 sulla voce appena letta, in modo da consentire una scansione del file. Questo
 vale anche per \func{getutid} e \func{getutline}, il che comporta che queste
 funzioni effettuano comunque una ricerca ``\textsl{in avanti}''.
@@ -1203,7 +1203,7 @@ lo spegnimento effettivo della macchina, occorre che il kernel effettui le
 opportune operazioni interagendo con il BIOS ed i dispositivi che controllano
 l'erogazione della potenza.
 
-Ia funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri
+La funzione di sistema che controlla lo spegnimento ed il riavvio (ed altri
 aspetti della relativa procedura) è \funcd{reboot},\footnote{la funzione
   illustrata è quella fornita dalla \acr{glibc} che maschera i dettagli di
   basso livello della \textit{system call} la quale richiede attualmente tre
@@ -1266,7 +1266,7 @@ illustra i comandi attualmente disponibili:
   kernel che è stato opportunamente caricato in memoria da una
   \func{kexec\_load} (che tratteremo a breve) eseguita in precedenza. La
   funzionalità è disponibile solo a partire dal kernel 2.6.13 e se il kernel
-  corrente è stato compilato inlcudendo il relativo supporto.\footnote{deve
+  corrente è stato compilato includendo il relativo supporto.\footnote{deve
     essere stata abilitata l'opzione di compilazione \texttt{CONFIG\_KEXEC}.}
   Questo meccanismo consente di eseguire una sorta di riavvio rapido che evita
   di dover ripassare dalla inizializzazione da parte del BIOS ed il lancio del
@@ -1285,7 +1285,7 @@ illustra i comandi attualmente disponibili:
   messaggio ``\textit{Restarting system with command '\%s'.}'' ed avviata
   immediatamente la procedura di riavvio usando il comando fornito
   nell'argomento \param{arg} che viene stampato al posto di \textit{'\%s'}
-  (veniva usato per lanciare un altro programma al posto di \cmd{init}. Nelle
+  (veniva usato per lanciare un altro programma al posto di \cmd{init}). Nelle
   versioni recenti questo argomento viene ignorato ed il riavvio può essere
   controllato dall'argomento di avvio del kernel \texttt{reboot=...}  Se non
   si è eseguita una sincronizzazione dei dati su disco con \func{sync} questi
@@ -1295,7 +1295,7 @@ illustra i comandi attualmente disponibili:
 
 Come appena illustrato usando il comando \const{LINUX\_REBOOT\_CMD\_KEXEC} si
 può eseguire un riavvio immediato pre-caricando una immagine del kernel, che
-verrà eseguita direttettamente. Questo meccanismo consente di evitare la
+verrà eseguita direttamente. Questo meccanismo consente di evitare la
 reinizializzazione della macchina da parte del BIOS, ed oltre a velocizzare un
 eventuale riavvio, ha il vantaggio poter accedere allo stato corrente della
 macchina e della memoria, per cui viene usato spesso per installare un kernel
@@ -1348,13 +1348,13 @@ secondi indirizzo e dimensione in \textit{kernel space}.
   \label{fig:kexec_segment}
 \end{figure}
 
-L'argomento \param{flags} è una maschera binaria che contiene i flag che
-consentono di indicare alcune specifiche relative alle modalità con cui dovrà
-essere eseguito il nuovo kernel. La parte meno significativa viene usata per
-impostare l'architettura di esecuzione, il valore \const{KEXEC\_ARCH\_DEFAULT}
-indica l'architettura corrente, ma se ne può specificare anche una diversa,
-con i valori della seconda parte di tab.~\ref{tab:kexec_load_flags}, e questa
-verrà usato posto che sia effettivamente eseguibile sul proprio processore.
+L'argomento \param{flags} è una maschera binaria contenente i flag che
+consentono di indicare le modalità con cui dovrà essere eseguito il nuovo
+kernel. La parte meno significativa viene usata per impostare l'architettura
+di esecuzione. Il valore \const{KEXEC\_ARCH\_DEFAULT} indica l'architettura
+corrente, ma se ne può specificare anche una diversa, con i valori della
+seconda parte di tab.~\ref{tab:kexec_load_flags}, e questa verrà usato posto
+che sia effettivamente eseguibile sul proprio processore.
 
 \begin{table}[htb]
   \footnotesize
@@ -1393,13 +1393,12 @@ verrà usato posto che sia effettivamente eseguibile sul proprio processore.
 \end{table}
 
 I due valori più importanti sono però quelli della parte più significativa
-di \param{flags} (riportati nella prima sezione di
-tab.~\ref{tab:kexec_load_flags}). Il primo, \const{KEXEC\_ON\_CRASH}, consente
-di impostare l'esecuzione automatica del nuovo kernel caricato in caso di
-crollo del sistema, e viene usato quando si carica un kernel di emergenza da
-utilizzare per poter raccogliere informazioni diagnostiche che altrimenti
-verrebbero perdute non essendo il kernel ordinario più in grado di essere
-eseguito in maniera coerente.  Il secondo valore,
+(riportati nella prima sezione di tab.~\ref{tab:kexec_load_flags}). Il primo,
+\const{KEXEC\_ON\_CRASH}, consente di impostare l'esecuzione automatica del
+nuovo kernel caricato in caso di crollo del sistema, e viene usato quando si
+carica un kernel di emergenza da utilizzare per poter raccogliere informazioni
+diagnostiche che altrimenti verrebbero perdute non essendo il kernel ordinario
+più in grado di essere eseguito in maniera coerente.  Il secondo valore,
 \const{KEXEC\_PRESERVE\_CONTEXT}, indica invece di preservare lo stato dei
 programmi e dei dispositivi, e viene in genere usato per realizzare la
 cosiddetta ibernazione in RAM.
@@ -1452,24 +1451,10 @@ da BSD 4.3,\footnote{questo non ha a nulla a che fare con il cosiddetto
   processo in maniera molto più dettagliata.} ma attualmente solo alcuni dei
 campi definiti sono effettivamente mantenuti. Con i kernel della serie 2.4 i
 soli campi che sono mantenuti sono: \var{ru\_utime}, \var{ru\_stime},
-\var{ru\_minflt}, \var{ru\_majflt}, e \var{ru\_nswap}. Con i kernel della
-serie 2.6 si aggiungono anche \var{ru\_nvcsw} e \var{ru\_nivcsw}, e a partire
-dal 2.6.22 anche \var{ru\_inblock} e \var{ru\_oublock}.
-
-I campi più utilizzati sono comunque \var{ru\_utime} e \var{ru\_stime} che
-indicano rispettivamente il tempo impiegato dal processo nell'eseguire le
-istruzioni in user space, e quello impiegato dal kernel nelle \textit{system
-  call} eseguite per conto del processo. I campi \var{ru\_minflt} e
-\var{ru\_majflt} servono a quantificare l'uso della memoria
-virtuale\index{memoria~virtuale} e corrispondono rispettivamente al numero di
-\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}), mentre \var{ru\_nswap} ed al numero di volte che
-il processo è stato completamente tolto dalla memoria per essere inserito
-nello swap.
-
-% TODO verificare \var{ru\_nswap} non citato nelle pagine di manuali recenti
+\var{ru\_minflt} e \var{ru\_majflt}. Con i kernel della serie 2.6 si
+aggiungono anche \var{ru\_nvcsw} e \var{ru\_nivcsw}, a partire dal 2.6.22
+anche \var{ru\_inblock} e \var{ru\_oublock} e dal 2.6.32 anche
+\var{ru\_maxrss}.
 
 In genere includere esplicitamente \file{<sys/time.h>} non è più strettamente
 necessario, ma aumenta la portabilità, e serve comunque quando, come nella
@@ -1497,7 +1482,7 @@ essa può anche essere letta direttamente utilizzando la funzione di sistema
   \begin{errlist}
   \item[\errcode{EINVAL}] l'argomento \param{who} non è valido
   \end{errlist}
-  ed inoltre  \errval{EFAULT} nel suo significato generico.
+  ed inoltre \errval{EFAULT} nel suo significato generico.
 }  
 \end{funcproto}
 
@@ -1534,12 +1519,40 @@ recepita nello standard POSIX.1-2001, che però indica come campi di
   \caption{Valori per l'argomento \param{who} di \func{getrusage}.} 
   \label{tab:getrusage_who}
 \end{table}
+
+I campi più utilizzati sono comunque \var{ru\_utime} e \var{ru\_stime} che
+indicano rispettivamente il tempo impiegato dal processo nell'eseguire le
+istruzioni in user space, e quello impiegato dal kernel nelle \textit{system
+  call} eseguite per conto del processo. I campi \var{ru\_minflt} e
+\var{ru\_majflt} servono a quantificare l'uso della memoria
+virtuale\index{memoria~virtuale} e corrispondono rispettivamente al numero di
+\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}).%  mentre \var{ru\_nswap} ed al numero di volte che
+% il processo è stato completamente tolto dalla memoria per essere inserito
+% nello swap.
+% TODO verificare \var{ru\_nswap} non citato nelle pagine di manuali recenti e
+% dato per non utilizzato.
+
+I campi \var{ru\_nvcsw} e \var{ru\_nivcsw} indicano il numero di volte che un
+processo ha subito un \textit{context switch} da parte dello
+\textit{scheduler} rispettivamente nel caso un cui questo avviene prima
+dell'esaurimento della propria \textit{time-slice} (in genere a causa di una
+\textit{system call} bloccante), o per averla esaurita o essere stato
+interrotto da un processo a priorità maggiore. I campi \var{ru\_inblock} e
+\var{ru\_oublock} indicano invece il numero di volte che è stata eseguita una
+attività di I/O su un filesystem (rispettivamente in lettura e scrittura) ed
+infine \var{ru\_maxrss} indica il valore più alto della
+\itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size} raggiunto dal
+processo stesso o, nel caso sia stato usato \const{RUSAGE\_CHILDREN}, da uno
+dei suoi figli.
  
 Si tenga conto che per un errore di implementazione nei i kernel precedenti il
 2.6.9, nonostante questo fosse esplicitamente proibito dallo standard POSIX.1,
 l'uso di \const{RUSAGE\_CHILDREN} comportava l'inserimento dell'ammontare
 delle risorse usate dai processi figli anche quando si era impostata una
-azione di \const{SIG\_ING} per il segnale \const{SIGCHLD} (per i segnali si
+azione di \const{SIG\_IGN} per il segnale \const{SIGCHLD} (per i segnali si
 veda cap.~\ref{cha:signals}). Il comportamento è stato corretto per aderire
 allo standard a partire dal kernel 2.6.9.
 
@@ -1567,8 +1580,9 @@ In generale il superamento di un limite corrente comporta o l'emissione di uno
 specifico segnale o il fallimento della \textit{system call} che lo ha
 provocato. A questo comportamento generico fanno eccezione \const{RLIMIT\_CPU}
 in cui si ha in comportamento diverso per il superamento dei due limiti e
-\const{RLIMIT\_CORE} che influenza soltanto la dimensione (o l'eventuale
-creazione) dei file di \itindex{core~dump} \textit{core dump}.
+\const{RLIMIT\_CORE} che influenza soltanto la dimensione o l'eventuale
+creazione dei file di \itindex{core~dump} \textit{core dump} (vedi
+sez.~\ref{sec:sig_standard}).
 
 Per permettere di leggere e di impostare i limiti di utilizzo delle risorse da
 parte di un processo sono previste due funzioni di sistema, \funcd{getrlimit}
@@ -1579,15 +1593,17 @@ e \funcd{setrlimit}, i cui prototipi sono:
 \fhead{sys/resource.h}
 \fhead{unistd.h}
 \fdecl{int getrlimit(int resource, struct rlimit *rlim)}
-\fdesc{Legge il limite corrente di una risorsa.}
+\fdesc{Legge i limiti di una risorsa.}
 \fdecl{int setrlimit(int resource, const struct rlimit *rlim)}
-\fdesc{Imposta il limite di una risorsa.}
+\fdesc{Imposta i limiti di una risorsa.}
 }
 
 {Le funzioni ritornano $0$ in caso di successo e $-1$ per un 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{EINVAL}] i valori per \param{resource} non sono validi o
+    nell'impostazione si è specificato \var{rlim->rlim\_cur} maggiore di
+    \var{rlim->rlim\_max}.
     \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha
     cercato di innalzare i propri limiti.
   \end{errlist}
@@ -1619,18 +1635,18 @@ Come accennato processo ordinario può alzare il proprio limite corrente fino
 al valore del limite massimo, può anche ridurre, irreversibilmente, il valore
 di quest'ultimo.  Nello specificare un limite, oltre a fornire dei valori
 specifici, si può anche usare la costante \const{RLIM\_INFINITY} che permette
-di sbloccare completamente l'uso di una risorsa; ma si ricordi che solo un
+di sbloccare completamente l'uso di una risorsa. Si ricordi però 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} (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.
 
-Come accennato ciascuna risorsa è identificata da uno specifico valore
-dell'argomento \param{resource}, i valori possibili per questo argomento, ed
-il significato della risorsa corrispondente, dei rispettivi limiti e gli
-effetti causati dal superamento degli stessi sono riportati nel seguente
-elenco:
+Ciascuna risorsa su cui si possono applicare dei limiti è identificata da uno
+specifico valore dell'argomento \param{resource}, i valori possibili per
+questo argomento, ed il significato della risorsa corrispondente, dei
+rispettivi limiti e gli effetti causati dal superamento degli stessi sono
+riportati nel seguente elenco:
 
 \begin{basedescript}{\desclabelwidth{2.2cm}}%\desclabelstyle{\nextlinelabel}}
 \item[\const{RLIMIT\_AS}] Questa risorsa indica, in byte, la dimensione
@@ -1647,10 +1663,10 @@ elenco:
 
 \item[\const{RLIMIT\_CORE}] Questa risorsa indica, in byte, la massima
   dimensione per un file di \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 nullo si bloccherà la creazione dei \itindex{core~dump}
-  \textit{core dump}.
+  sez.~\ref{sec:sig_standard}) creato nella terminazione di un processo. File
+  di dimensioni maggiori verranno troncati a questo valore, mentre con un
+  valore nullo si bloccherà la creazione dei \itindex{core~dump} \textit{core
+    dump}.
 
 \item[\const{RLIMIT\_CPU}] Questa risorsa indica, in secondi, il massimo tempo
   di CPU (vedi sez.~\ref{sec:sys_cpu_times}) che il processo può usare. Il
@@ -1738,63 +1754,116 @@ messaggi vuoti che comunque richiede delle risorse di gestione. Questa risorsa
   \errcode{EAGAIN}.
 
 \item[\const{RLIMIT\_RSS}] Questa risorsa indica, in pagine di memoria, la
-  dimensione massima della memoria residente (il codiddetto RSS
+  dimensione massima della memoria residente (il cosiddetto RSS
   \itindex{Resident~Set~Size~(RSS)} \textit{Resident Set Size}) cioè
   l'ammontare della memoria associata al processo che risiede effettivamente
-  in RAM (e non a quella eventualmente portata sulla \textit{swap} o non
-  ancora caricata dal filesystem (per il \index{segmento!testo} segmento testo
-  del programma).  Ha effetto solo sulle chiamate a \func{madvise} con
+  in RAM e non a quella eventualmente portata sulla \textit{swap} o non ancora
+  caricata dal filesystem per il \index{segmento!testo} segmento testo del
+  programma.  Ha effetto solo sulle chiamate a \func{madvise} con
   \const{MADV\_WILLNEED} (vedi sez.~\ref{sec:file_memory_map}). Presente solo
   sui i kernel precedenti il 2.4.30.
 
-\item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il 
+\item[\const{RLIMIT\_RTPRIO}] Questa risorsa indica il valore massimo della
+  priorità statica che un processo può assegnarsi o assegnare con
+  \func{sched\_setscheduler} e \func{sched\_setparam} (vedi
+  sez.~\ref{sec:proc_real_time}). Il limite è stato introdotto a partire dal
+  kernel 2.6.12 (ma per un bug è effettivo solo a partire dal 2.6.13). In
+  precedenza solo i processi con privilegi amministrativi potevano avere una
+  priorità statica ed utilizzare una politica di \textit{scheduling} di tipo
+  \textit{real-time}.
+
+\item[\const{RLIMIT\_RTTIME}] Questa risorsa indica, in microsecondi, il tempo
+  massimo di CPU che un processo eseguito con una priorità statica può
+  consumare. Il superamento del limite corrente comporta l'emissione di un
+  segnale di \signal{SIGXCPU}, e quello del limite massimo di \signal{SIGKILL}
+  con le stesse regole viste \const{RLIMIT\_CPU}: se \signal{SIGXCPU} viene
+  intercettato ed ignorato il segnale verrà riemesso ogni secondo fino al
+  superamento del limite massimo. Questo limite è stato introdotto con il
+  kernel 2.6.25 per impedire che un processo \textit{real-time} possa bloccare
+  il sistema.
 
 % TODO trattare i seguenti...
-%    \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
 
 
-\item[\const{RLIMIT\_SIGPENDING}] Il numero massimo di segnali che possono
-  essere mantenuti in coda per ciascun utente, considerando sia i segnali
-  normali che real-time (vedi sez.~\ref{sec:sig_real_time}). Il limite è
+\item[\const{RLIMIT\_SIGPENDING}] Questa risorsa indica il numero massimo di
+  segnali che possono essere mantenuti in coda per ciascun utente,
+  identificato per \ids{UID} reale. Il limite comprende sia i segnali normali
+  che quelli \textit{real-time} (vedi sez.~\ref{sec:sig_real_time}) ed è
   attivo solo per \func{sigqueue}, con \func{kill} si potrà sempre inviare un
-  segnale che non sia già presente su una coda.\footnote{il limite su questa
-    risorsa è stato introdotto con il kernel 2.6.8.}
+  segnale che non sia già presente su una coda. Questo limite è stato
+  introdotto con il kernel 2.6.8.
+
+\item[\const{RLIMIT\_STACK}] Questa risorsa indica, in byte, la massima
+  dimensione dello \itindex{stack} \textit{stack} del processo. Se il processo
+  esegue operazioni che estendano lo \textit{stack} oltre questa dimensione
+  riceverà un segnale di \signal{SIGSEGV}. 
+
+  A partire dal kernel 2.6.23 questo stesso limite viene applicato per la gran
+  parte delle architetture anche ai dati che possono essere passati come
+  argomenti e variabili di ambiente ad un programma posto in esecuzione con
+  \func{execve}, nella misura di un quarto del valore indicato per lo
+  \textit{stack}.  Questo valore in precedenza era fisso e pari a 32 pagine di
+  memoria, corrispondenti per la gran parte delle architetture a 128kb di
+  dati, dal 2.6.25, per evitare problemi di compatibilità quando
+  \const{RLIMIT\_STACK} è molto basso, viene comunque garantito uno spazio
+  base di 32 pagine qualunque sia l'architettura.
 
+\end{basedescript}
 
-\item[\const{RLIMIT\_RSS}] L'ammontare massimo di pagine di memoria dato al
-  \index{segmento!testo} testo del processo. Il limite è solo una indicazione
-  per il kernel, qualora ci fosse un surplus di memoria questa verrebbe
-  assegnata.
+Si tenga conto infine che tutti i limiti eventualmente presenti su un processo
+vengono ereditati dai figli da esso creati attraverso una \func{fork} (vedi
+sez.~\ref{sec:proc_fork}) e mantenuti invariati per i programmi messi in
+esecuzione attraverso una \func{exec} (vedi sez.~\ref{sec:proc_exec}).
 
-\item[\const{RLIMIT\_STACK}] La massima dimensione dello \itindex{stack}
-  \textit{stack} del processo. Se il processo esegue operazioni che estendano
-  lo \textit{stack} oltre questa dimensione riceverà un segnale di
-  \signal{SIGSEGV}.
+Si noti come le due funzioni \func{getrlimit} e \func{setrlimit} consentano di
+operare solo sul processo corrente. Per questo motivo a partire dal kernel
+2.6.36 (e dalla \acr{glibc} 2.13) è stata introdotta un'altra funzione di
+sistema \funcd{prlimit} il cui scopo è quello di estendere e sostituire le
+precedenti.  Il suo prototipo è:
 
-% TODO dal 2.6.23 il significato è cambiato, vedi anche man execve
+\begin{funcproto}{
+\fhead{sys/resource.h}
+\fdecl{int prlimit(pid\_t pid, int resource, const struct rlimit *new\_limit,\\
+\phantom{int prlimit(}struct rlimit *old\_limit}
+\fdesc{Legge e imposta i limiti di una risorsa.} 
+}
 
-% TODO: aggiungere a \const{RLIMIT\_STACK} i dati di execve:
-% Questi fino al kernel 2.6.23 erano fissi e costituiti da
-% 32 pagine di memoria (corrispondenti per la gran parte delle architetture a
-% 128kb di dati). Dal 2.6.23 su molte architettire il limite viene stabilito in
-% base al valore della risorsa \const{RLIMIT\_STACK} (vedi
-% sez.~\ref{sec:sys_resource_limit}), ad un quarto dello spazio da essa
-% indicato). Dal 2.6.25 viene comunque garantito uno spazio base di 32 pagine.
+{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
+  caso \var{errno} assumerà uno dei valori:
+  \begin{errlist}
+  \item[\errcode{EINVAL}] i valori per \param{resource} non sono validi o
+    nell'impostazione si è specificato \var{rlim->rlim\_cur} maggiore di
+    \var{rlim->rlim\_max}.
+  \item[\errcode{EPERM}] un processo senza i privilegi di amministratore ha
+    cercato di innalzare i propri limiti o si è cercato di modificare i limiti
+    di un processo di un altro utente.
+  \item [\errcode{ESRCH}] il process \param{pid} non esiste.
+  \end{errlist}
+  ed inoltre \errval{EFAULT} nel suo significato generico.
+}
+\end{funcproto}
 
-% TODO integrare con la roba di madvise
-% TODO integrare con le ultime aggiunte, vedi pagina di manuale
+La funzione è specifica di Linux e non portabile; per essere usata richiede
+che sia stata definita la macro \macro{\_GNU\_SOURCE}. Il primo argomento
+indica il \ids{PID} del processo di cui si vogliono cambiare i limiti e si può
+usare un valore nullo per indicare il processo chiamante.  Per modificare i
+limiti di un altro processo, a meno di non avere privilegi
+amministrativi,\footnote{anche in questo caso la \itindex{capabilities}
+  \textit{capability} necessaria è \const{CAP\_SYS\_RESOURCE} (vedi
+  sez.~\ref{sec:proc_capabilities}).}  l'\ids{UID} ed il \ids{GID} reale del
+chiamante devono coincidere con \ids{UID} e \ids{GID} del processo indicato
+per i tre gruppi reale, effettivo e salvato.
 
-% TODO trattare prlimit64 introdotta con il 2.6.36 che dovrebbe sostituire
-% setrlimit 
+Se \param{new\_limit} non è \val{NULL} verrà usato come puntatore alla
+struttura \struct{rlimit} contenente i valori dei nuovi limiti da impostare,
+mentre se \param{old\_limit} non è \val{NULL} verranno letti i valori correnti
+del limiti nella struttura \struct{rlimit} da esso puntata. In questo modo è
+possibile sia leggere che scrivere, anche in contemporanea, i valori dei
+limiti. Il significato dell'argomento \param{resource} resta identico rispetto
+a \func{getrlimit} e \func{setrlimit}, così come i restanti requisiti. 
 
-\end{basedescript}
-
-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}
@@ -1803,29 +1872,42 @@ sez.~\ref{sec:proc_exec}).
 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 \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
-casi, come per l'I/O mappato in memoria (vedi sez.~\ref{sec:file_memory_map})
-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 \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
-bastava utilizzare in fase di compilazione, ma oggi, con la presenza di alcune
-architetture (ad esempio Sun Sparc) che permettono di variare questa
-dimensione, per non dover ricompilare i programmi per ogni possibile modello e
-scelta di dimensioni, è necessario poter utilizzare una funzione.
+divisione della memoria fisica in pagine.  In genere tutto ciò è del tutto
+trasparente al singolo processo, ma in certi casi, come per l'I/O mappato in
+memoria (vedi sez.~\ref{sec:file_memory_map}) 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
+\index{paginazione} paginazione.
+
+Un tempo la dimensione delle pagine di memoria era fissata una volta per tutte
+dall'architettura hardware, per cui il relativo valore veniva mantenuto in una
+costante che bastava utilizzare in fase di compilazione. Oggi invece molte
+architetture permettono di variare questa dimensione (ad esempio sui PC
+recenti si possono usare pagine di 4kb e di 4 Mb) per cui per non dover
+ricompilare i programmi per ogni possibile caso e relativa scelta di
+dimensioni, è necessario poter utilizzare una funzione.
 
 Dato che si tratta di una caratteristica generale del sistema, questa
 dimensione può essere ottenuta come tutte le altre attraverso una chiamata a
-\func{sysconf}, \footnote{nel caso specifico si dovrebbe utilizzare il
-  parametro \const{\_SC\_PAGESIZE}.}  ma in BSD 4.2 è stata introdotta una
-apposita funzione, \funcd{getpagesize}, che restituisce la dimensione delle
-pagine di memoria; il suo prototipo è:
-\begin{prototype}{unistd.h}{int getpagesize(void)}
+\func{sysconf} (nel caso specifico si dovrebbe utilizzare il parametro
+\const{\_SC\_PAGESIZE}) ma in BSD 4.2 è stata introdotta una apposita funzione
+di sistema \funcd{getpagesize} che restituisce la dimensione delle pagine di
+memoria. La funzione è disponibile anche su Linux ed il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{unistd.h}
+\fdecl{int getpagesize(void)}
+\fdesc{Legge la dimensione delle pagine di memoria.} 
+}
+
+{La funzione ritorna la dimensione di una pagina in byte, e non sono previsti
+  errori.}
+\end{funcproto}
+
+
+\begin{prototype}{unistd.h}
+{int getpagesize(void)}
   Legge le dimensioni delle pagine di memoria.
   
   \bodydesc{La funzione ritorna la dimensione di una pagina in byte, e non
@@ -2193,7 +2275,7 @@ 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,
 quindi anche per quelle che tratteremo in seguito) può essere utilizzata solo
 da un processo coi privilegi di amministratore.\footnote{più precisamente la
-  capabitity \const{CAP\_SYS\_TIME}.}
+  capability \const{CAP\_SYS\_TIME}.}
 
 Il secondo argomento di entrambe le funzioni è una struttura
 \struct{timezone}, che storicamente veniva utilizzata per specificare appunto
@@ -2822,7 +2904,7 @@ linea non vengano ripetuti.
 % LocalWords:  SHRT short USHRT int UINT LONG long ULONG LLONG ULLONG POSIX ARG
 % LocalWords:  Stevens exec CHILD STREAM stream TZNAME timezone NGROUPS SSIZE
 % LocalWords:  ssize LISTIO JOB CONTROL job control IDS VERSION YYYYMML bits bc
-% LocalWords:  dall'header posix lim nell'header glibc run unistd name errno
+% LocalWords:  dall'header posix lim nell'header glibc run unistd name errno SC
 % LocalWords:  NGROUP CLK TCK clock tick process PATH pathname BUF CANON path
 % LocalWords:  pathconf fpathconf descriptor fd uname sys struct utsname info
 % LocalWords:  EFAULT fig SOURCE NUL LENGTH DOMAIN NMLN UTSLEN system call proc
@@ -2830,7 +2912,7 @@ linea non vengano ripetuti.
 % LocalWords:  newlen ENOTDIR EINVAL ENOMEM linux array oldvalue paging stack
 % LocalWords:  TCP shell Documentation ostype hostname osrelease version mount
 % LocalWords:  const source filesystemtype mountflags ENODEV ENOTBLK block read
-% LocalWords:  device EBUSY only EACCES NODEV ENXIO major
+% LocalWords:  device EBUSY only EACCES NODEV ENXIO major RTSIG syscall PID NSS
 % LocalWords:  number EMFILE dummy ENAMETOOLONG ENOENT ELOOP virtual devfs MGC
 % LocalWords:  magic MSK RDONLY NOSUID suid sgid NOEXEC SYNCHRONOUS REMOUNT MNT
 % LocalWords:  MANDLOCK mandatory locking WRITE APPEND append IMMUTABLE NOATIME
@@ -2849,23 +2931,29 @@ linea non vengano ripetuti.
 % LocalWords:  SIGSEGV SIGXCPU SIGKILL sbrk FSIZE SIGXFSZ EFBIG LOCKS lock dup
 % LocalWords:  MEMLOCK NOFILE NPROC fork EAGAIN SIGPENDING sigqueue kill RSS tv
 % LocalWords:  resource getrlimit setrlimit rlimit rlim INFINITY capabilities
-% LocalWords:  capability CAP l'I Sun Sparc PAGESIZE getpagesize SVr SUSv get
+% LocalWords:  capability CAP Sun Sparc PAGESIZE getpagesize SVr SUSv get IGN
 % LocalWords:  phys pages avphys NPROCESSORS CONF ONLN getloadavg stdlib double
-% LocalWords:  loadavg nelem scheduler CONFIG ACCT acct filename EUSER
+% LocalWords:  loadavg nelem scheduler CONFIG ACCT acct filename EUSER sizeof
 % LocalWords:  ENFILE EROFS PACCT AcctCtrl cap calendar UTC Jan the Epoch GMT
 % LocalWords:  Greenwich Mean l'UTC timer CLOCKS SEC cron wall elapsed times tz
-% LocalWords:  tms cutime cstime waitpid gettimeofday settimeofday timex
-% LocalWords:  timespec adjtime olddelta adjtimex David Mills RFC NTP ntp
+% LocalWords:  tms cutime cstime waitpid gettimeofday settimeofday timex NetBSD
+% LocalWords:  timespec adjtime olddelta adjtimex David Mills RFC NTP ntp cmd
 % LocalWords:  nell'RFC ADJ FREQUENCY frequency MAXERROR maxerror ESTERROR PLL
 % LocalWords:  esterror TIMECONST constant SINGLESHOT MOD INS insert leap OOP
 % LocalWords:  second delete progress has occurred BAD broken tm gmtoff asctime
 % LocalWords:  ctime timep gmtime localtime mktime tzname tzset daylight format
 % LocalWords:  strftime thread EOF modifiable lvalue app errcode strerror LC at
-% LocalWords:  perror string errnum MESSAGES error message ErrCode strtol log
+% LocalWords:  perror string errnum MESSAGES error message strtol log
 % LocalWords:  program invocation argv printf print progname exit count fname
-% LocalWords:  lineno one standardese Di page Wed Wednesday Apr April PM AM
-% LocalWords:  CEST
-
+% LocalWords:  lineno one standardese Di page Wed Wednesday Apr April PM AM CAD
+% LocalWords:  CEST utmpxname Solaris updwtmpx reboot RESTART Ctrl OFF SIGINT
+% LocalWords:  HALT halted sync KEXEC kexec load bootloader POWER Power with nr
+% LocalWords:  Restarting command arg entry segments segment ARCH CRASH CONTEXT
+% LocalWords:  PRESERVE PPC IA ARM SH MIPS nvcsw nivcsw inblock oublock maxrss
+% LocalWords:  context switch slice Resident SIG SIGCHLD cur Gb lease mlock
+% LocalWords:  memory mlockall MAP LOCKED shmctl MSGQUEUE attr NICE nice MADV
+% LocalWords:  madvise WILLNEED RTPRIO sched setscheduler setparam scheduling
+% LocalWords:  RTTIME execve kb prlimit pid new old ESRCH EUSERS
 
 
 %%% Local Variables: