fine revisione di \macro{}, piu' una serie di correzioni nella rilettura.
[gapil.git] / process.tex
index d708c2eacf895761bd872e5069c3f15866a6b0a8..61cca0f1535d1b2ea04866424e9c1d54c1020495 100644 (file)
@@ -467,20 +467,20 @@ prototipi sono i seguenti:
   
   La funzione restituisce il puntatore alla zona di memoria allocata in caso
   di successo e \val{NULL} in caso di fallimento, nel qual caso
-  \var{errno} assumerà il valore \const{ENOMEM}.
+  \var{errno} assumerà il valore \errval{ENOMEM}.
 \funcdecl{void *malloc(size\_t size)}
   Alloca \var{size} byte nello heap. La memoria non viene inizializzata.
 
   La funzione restituisce il puntatore alla zona di memoria allocata in caso
   di successo e \val{NULL} in caso di fallimento, nel qual caso
-  \var{errno} assumerà il valore \const{ENOMEM}.
+  \var{errno} assumerà il valore \errval{ENOMEM}.
 \funcdecl{void *realloc(void *ptr, size\_t size)}
   Cambia la dimensione del blocco allocato all'indirizzo \var{ptr}
   portandola a \var{size}.
 
   La funzione restituisce il puntatore alla zona di memoria allocata in caso
   di successo e \val{NULL} in caso di fallimento, nel qual caso
-  \var{errno} assumerà il valore \const{ENOMEM}.
+  \var{errno} assumerà il valore \errval{ENOMEM}.
 \funcdecl{void free(void *ptr)}
   Disalloca lo spazio di memoria puntato da \var{ptr}.
 
@@ -627,7 +627,7 @@ stack della funzione corrente. La sintassi 
 
   La funzione restituisce il puntatore alla zona di memoria allocata in caso
   di successo e \val{NULL} in caso di fallimento, nel qual caso
-  \var{errno} assumerà il valore \const{ENOMEM}.
+  \var{errno} assumerà il valore \errval{ENOMEM}.
 \end{prototype}
 \noindent ma in questo caso non è più necessario liberare la memoria (e quindi
 non esiste un analogo della \func{free}) in quanto essa viene rilasciata 
@@ -679,7 +679,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono:
   \var{end\_data\_segment}.
   
   La funzione restituisce 0 in caso di successo e -1 in caso di
-    fallimento, nel qual caso \var{errno} assumerà il valore \const{ENOMEM}.
+    fallimento, nel qual caso \var{errno} assumerà il valore \errval{ENOMEM}.
 
   \funcdecl{void *sbrk(ptrdiff\_t increment)} Incrementa lo spazio dati di un
   programma di \var{increment}. Un valore zero restituisce l'attuale posizione
@@ -687,7 +687,7 @@ analoghe system call a cui fanno da interfaccia. I loro prototipi sono:
   
   La funzione restituisce il puntatore all'inizio della nuova zona di memoria
   allocata in caso di successo e \val{NULL} in caso di fallimento, nel qual
-  caso \var{errno} assumerà il valore \const{ENOMEM}.
+  caso \var{errno} assumerà il valore \errval{ENOMEM}.
 \end{functions}
 \noindent in genere si usa \func{sbrk} con un valore zero per ottenere
 l'attuale posizione della fine del segmento dati.
@@ -754,20 +754,22 @@ sbloccarla due volte, una pagina o 
 Il \textit{memory lock} persiste fintanto che il processo che detiene la
 memoria bloccata non la sblocca. Chiaramente la terminazione del processo
 comporta anche la fine dell'uso della sua memoria virtuale, e quindi anche di
-tutti i suoi \textit{memory lock}.
-
-I \textit{memory lock} non sono ereditati dai processi figli.\footnote{ma
-  siccome Linux usa il \textit{copy on write}\index{copy on write} (vedi
-  \secref{sec:proc_fork}) gli indirizzi virtuali del figlio sono mantenuti
-  sullo stesso segmento di RAM del padre, quindi fintanto che un figlio non
-  scrive su un segmento, può usufruire del memory lock del padre.}  Siccome la
-presenza di un \textit{memory lock} riduce la memoria disponibile al sistema,
-con un impatto su tutti gli altri processi, solo l'amministratore ha la
-capacità di bloccare una pagina. Ogni processo può però sbloccare le pagine
+tutti i suoi \textit{memory lock}.  Infine \textit{memory lock} non sono
+ereditati dai processi figli.\footnote{ma siccome Linux usa il \textit{copy on
+    write}\index{copy on write} (vedi \secref{sec:proc_fork}) gli indirizzi
+  virtuali del figlio sono mantenuti sullo stesso segmento di RAM del padre,
+  quindi fintanto che un figlio non scrive su un segmento, può usufruire del
+  memory lock del padre.}
+
+Siccome la richiesta di un \textit{memory lock} da parte di un processo riduce
+la memoria fisica disponibile nel sistema, questo ha un evidente impatto su
+tutti gli altri processi, per cui solo un processo con i privilegi di
+amministratore (vedremo in \secref{sec:proc_perms} cosa significa) ha la
+capacità di bloccare una pagina.  Ogni processo può però sbloccare le pagine
 relative alla propria memoria.
 
 Il sistema pone dei limiti all'ammontare di memoria di un processo che può
-essere bloccata e al totale di memoria fisica che può dedicare a questo, lo
+essere bloccata e al totale di memoria fisica che si può dedicare a questo, lo
 standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro
 \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il
 \textit{memory locking} e la costante \const{PAGESIZE} in \file{limits.h} per
@@ -796,7 +798,7 @@ Le funzioni per bloccare e sbloccare singole sezioni di memoria sono
     il numero massimo consentito di pagine bloccate.
   \item[\errcode{EINVAL}] \var{len} non è un valore positivo.
   \end{errlist}
-  e, per \func{mlock}, anche \const{EPERM} quando il processo non ha i
+  e, per \func{mlock}, anche \errval{EPERM} quando il processo non ha i
   privilegi richiesti per l'operazione.}
 \end{functions}
 
@@ -1062,16 +1064,21 @@ pi
 \end{figure}
 
 Per convenzione le stringhe che definiscono l'ambiente sono tutte del tipo
-\textsl{\texttt{nome=valore}}. Inoltre alcune variabili, come quelle elencate
+\textsl{\texttt{nome=valore}}.  Inoltre alcune variabili, come quelle elencate
 in \figref{fig:proc_envirno_list}, sono definite dal sistema per essere usate
 da diversi programmi e funzioni: per queste c'è l'ulteriore convenzione di
-usare nomi espressi in caratteri maiuscoli.
+usare nomi espressi in caratteri maiuscoli.\footnote{la convenzione vuole che
+  si usino dei nomi maiuscoli per le variabili di ambiente di uso generico, i
+  nomi minuscoli sono in genere riservati alle variabili interne degli script
+  di shell.}
 
 Il kernel non usa mai queste variabili, il loro uso e la loro interpretazione è
 riservata alle applicazioni e ad alcune funzioni di libreria; in genere esse
 costituiscono un modo comodo per definire un comportamento specifico senza
 dover ricorrere all'uso di opzioni a linea di comando o di file di
-configurazione. 
+configurazione. É di norma cura della shell, quando esegue un comando, passare
+queste variabili al programma messo in esecuzione attraverso un uso opportuno
+delle relative chiamate (si veda \secref{sec:proc_exec}).
 
 La shell ad esempio ne usa molte per il suo funzionamento (come \var{PATH} per
 la ricerca dei comandi, o \cmd{IFS} per la scansione degli argomenti), e
@@ -1102,24 +1109,27 @@ controllare \cmd{man environ}.
     Directory base dell'utente\\
     \val{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & Localizzazione\\
     \val{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & Elenco delle directory
-    dei programmi\\
+                                                     dei programmi\\
     \val{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & Directory corrente\\
     \val{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & Shell in uso\\
     \val{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & Tipo di terminale\\
     \val{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & Programma per vedere i
-    testi\\
+                                                      testi\\
     \val{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & Editor preferito\\
     \val{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & Browser preferito\\
+    \val{TMPDIR} & $\bullet$ & $\bullet$ & $\bullet$ & Directory dei file
+                                                       temporanei\\
     \hline
   \end{tabular}
-  \caption{Variabili di ambiente più comuni definite da vari standard.}
+  \caption{Esempi di variabili di ambiente più comuni definite da vari
+    standard.} 
   \label{tab:proc_env_var}
 \end{table}
 
-Lo standard ANSI C prevede l'esistenza di un ambiente, pur non entrando nelle
-specifiche di come sono strutturati i contenuti, e definisce la funzione
-\func{getenv} che permette di ottenere i valori delle variabili di ambiente,
-il cui prototipo è:
+Lo standard ANSI C prevede l'esistenza di un ambiente, e pur non entrando
+nelle specifiche di come sono strutturati i contenuti, definisce la funzione
+\func{getenv} che permette di ottenere i valori delle variabili di ambiente;
+il suo prototipo è:
 \begin{prototype}{stdlib.h}{char *getenv(const char *name)}
   Esamina l'ambiente del processo cercando una stringa che corrisponda a
   quella specificata da \param{name}. 
@@ -1160,10 +1170,11 @@ in \tabref{tab:proc_env_func}.
   \label{tab:proc_env_func}
 \end{table}
 
-In Linux solo le prime quattro funzioni di \tabref{tab:proc_env_func} sono
-definite, \func{getenv} l'abbiamo già esaminata; delle tre restanti le prime
-due, \func{putenv} e \func{setenv}, servono per assegnare nuove variabili di
-ambiente, i loro prototipi sono i seguenti:
+In Linux sono definite solo le prime quattro delle funzioni elencate in
+\tabref{tab:proc_env_func}. La prima, \func{getenv}, l'abbiamo appena
+esaminata; delle tre restanti le prime due, \func{putenv} e \func{setenv},
+servono per assegnare nuove variabili di ambiente, i loro prototipi sono i
+seguenti:
 \begin{functions}
   \headdecl{stdlib.h} 
   
@@ -1174,7 +1185,7 @@ ambiente, i loro prototipi sono i seguenti:
   all'ambiente.
   
   \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 per un
-    errore, che è sempre \const{ENOMEM}.}
+    errore, che è sempre \errval{ENOMEM}.}
 \end{functions}
 \noindent la terza, \func{unsetenv}, serve a cancellare una variabile di
 ambiente; il suo prototipo è: