Aggiunte funzioni di gestione per le varibili di ambiente
[gapil.git] / process.tex
index aac25b13ed16c0731c2728e15a77d0cb72b87063..1ec17806a6050d8783953f63001809e0b4fad10f 100644 (file)
@@ -153,7 +153,7 @@ prototipo della funzione 
   La funzione non ritorna. Il processo viene terminato.
 \end{prototype}
 
-La funzione chiude tutti i file descriptor appartenenti al processo (sui tenga
+La funzione chiude tutti i file descriptor appartenenti al processo (si tenga
 presente che questo non comporta il salvataggio dei dati bufferizzati degli
 stream), fa si che ogni figlio del processo sia ereditato da \cmd{init}
 (vedi \secref{cha:process_handling}), manda un segnale \macro{SIGCHLD} al
@@ -570,7 +570,7 @@ questa viene rilasciata automaticamente al ritorno della funzione.
 Come è evidente questa funzione ha molti vantaggi, e permette di evitare i
 problemi di memory leak non essendo più necessaria la deallocazione esplicita;
 una delle ragioni principali per usarla è però che funziona anche quando si
-usa \func{longjump} per uscire con un salto non locale da una funzione (vedi
+usa \func{longjmp} per uscire con un salto non locale da una funzione (vedi
 \secref{sec:proc_longjmp}),
 
 Un altro vantaggio e che in Linux la funzione è molto veloce e non viene
@@ -712,7 +712,7 @@ Le funzioni per bloccare e sbloccare singole sezioni di memoria sono
   caso \var{errno} è settata ad uno dei valori seguenti:
   \begin{errlist}
   \item \macro{ENOMEM} alcuni indirizzi dell'intervallo specificato non
-    corripondono allo spazio di indirizzi del processo o si è ecceduto il
+    corrispondono allo spazio di indirizzi del processo o si è ecceduto il
     numero massimo consentito di pagine bloccate.
   \item \macro{EPERM} il processo non ha i privilegi richiesti per
     l'operazione. 
@@ -727,7 +727,7 @@ Le funzioni per bloccare e sbloccare singole sezioni di memoria sono
   \var{errno} è settata ad uno dei valori seguenti:
   \begin{errlist}
   \item \macro{ENOMEM} alcuni indirizzi dell'intervallo specificato non
-    corripondono allo spazio di indirizzi del processo.
+    corrispondono allo spazio di indirizzi del processo.
   \item \macro{EINVAL} \var{len} non è un valore positivo.
   \end{errlist}
 \end{functions}
@@ -753,12 +753,12 @@ queste funzioni sono:
 Il parametro \var{flags} di \func{mlockall} permette di controllarne il
 comportamento; esso può essere specificato come l'OR aritmetico delle due
 costanti: 
-\begin{description*}
-\item \macro{MCL\_CURRENT} blocca tutte le pagine correntemente mappate nello
+\begin{basedescript}{\desclabelwidth{2.5cm}}
+\item[\macro{MCL\_CURRENT}] blocca tutte le pagine correntemente mappate nello
   spazio di indirizzi del processo.
-\item \macro{MCL\_FUTURE} blocca tutte le pagine che saranno mappate nello
+\item[\macro{MCL\_FUTURE}] blocca tutte le pagine che saranno mappate nello
   spazio di indirizzi del processo.
-\end{description*}
+\end{basedescript}
 
 Con \func{mlockall} si può bloccare tutte le pagine mappate nello spazio di
 indirizzi del processo, sia che comprendano il segmento di testi, di dati, lo
@@ -991,31 +991,35 @@ anche altre: per una lista pi
 
 \begin{table}[htb]
   \centering
-  \begin{tabular}[c]{|l|c|c|c|p{6cm}|}
+  \begin{tabular}[c]{|l|c|c|c|p{7cm}|}
     \hline
-    \textbf{Variabile} & POSIX & XPG & Linux & \textbf{Descrizione} \\
+    \textbf{Variabile} & \textbf{POSIX} & \textbf{XPG3} 
+    & \textbf{Linux} & \textbf{Descrizione} \\
     \hline
     \hline
-    \macro{USER} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{LOGNAME} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{HOME} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & \\
-    \macro{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & \\    
+    \macro{USER} & $\bullet$ & $\bullet$ & $\bullet$ & Nome utente\\
+    \macro{LOGNAME} & $\bullet$ & $\bullet$ & $\bullet$ & Nome utente\\
+    \macro{HOME} & $\bullet$ & $\bullet$ & $\bullet$ & 
+    Directory base dell'utente\\
+    \macro{LANG} & $\bullet$ & $\bullet$ & $\bullet$ & Localizzazione\\
+    \macro{PATH} & $\bullet$ & $\bullet$ & $\bullet$ & Elenco delle directory
+    dei programmi\\
+    \macro{PWD} & $\bullet$ & $\bullet$ & $\bullet$ & Directory corrente\\
+    \macro{SHELL} & $\bullet$ & $\bullet$ & $\bullet$ & Shell in uso\\
+    \macro{TERM} & $\bullet$ & $\bullet$ & $\bullet$ & Tipo di terminale\\
+    \macro{PAGER} & $\bullet$ & $\bullet$ & $\bullet$ & Programma per vedere i
+    testi\\
+    \macro{EDITOR} & $\bullet$ & $\bullet$ & $\bullet$ & Editor di default\\
+    \macro{BROWSER} & $\bullet$ & $\bullet$ & $\bullet$ & Browser di default\\
+    \hline
   \end{tabular}
   \caption{Variabile di ambiente più comuni definite da vari standard}
   \label{tab:proc_env_var}
 \end{table}
 
-Lo standard ANSI C, pur lasciando alle varie implementazioni i contenuti,
-definisce la funzione \func{getenv} che permetta di ottenere i valori delle
-varibili di ambiente, il suo prototipo è:
-
+Lo standard ANSI C, 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}. 
@@ -1024,6 +1028,68 @@ varibili di ambiente, il suo prototipo 
   corrisponde (di solito nella forma \texttt{NOME=valore}).
 \end{prototype}
 
+Oltre a questa funzione di lettura, che è l'unica definita dallo standard ANSI
+C, in seguito sono state proposte altre da utilizzare per settare e per
+cancellare le variabili di ambiente presenti; uno schema delle funzioni
+previste nei vari standard unix e disponibili in Linux è riportato in \ntab.
+
+\begin{table}[htb]
+  \centering
+  \begin{tabular}[c]{|l|c|c|c|c|c|c|}
+    \hline
+    \textbf{Funzione} & \textbf{ANSI C} & \textbf{POSIX.1} & \textbf{XPG3} & 
+    \textbf{SVr4} & \textbf{BSD} & \textbf{Linux} \\
+    \hline
+    \hline
+    \func{getenv} & $\bullet$ &  $\bullet$ & $\bullet$ & 
+      $\bullet$ & $\bullet$ & $\bullet$ \\
+    \func{setenv} &   &   &    & 
+        & $\bullet$ & $\bullet$ \\
+    \func{unsetenv} &  &   &    & 
+        & $\bullet$ & $\bullet$ \\
+    \func{putenv} &  & opz.  & $\bullet$ & 
+        & $\bullet$ & $\bullet$ \\
+    \func{clearenv} &  & opz.  &    & 
+        &  &  \\
+    \hline
+  \end{tabular}
+  \caption{Funzioni per la gestione delle variabili di ambiente.}
+  \label{tab:proc_env_func}
+\end{table}
+
+In Linux solo le prime quattro funzioni di \curtab\ sono definite; i prototipi
+delle restanti tre sono i seguenti:
+
+\begin{functions}
+  \headdecl{stdlib.h}
+  \funcdecl{int putenv(char *string)}
+  La funzione aggiunge la stringa \param{string} all'ambiente.
+  \funcdecl{int setenv(const char *name, const char *value, int overwrite)}
+  La funzione setta la variabile di ambiente \param{name} al valore
+  \param{value}.
+  
+  Entrembe le funzioni ritornano 0 in caso di successo e -1 per un errore, che
+  è sempre \macro{ENOMEM}.
+
+  \funcdecl{void unsetenv(const char *name)}
+  La funzione rimuove la variabile di ambiente \param{name}.  
+\end{functions}
+
+Per modificare o aggiungere una variabile di ambiente si possono usare le
+funzioni \func{putenv} e \func{setenv}. La prima prende come parametro una
+stringa analoga quella restituita da \func{getenv}, e sempre nella forma
+\texttt{NOME=valore}, se la variabile esiste verrà modificata, altrimenti sarà
+aggiunta. La seconda permette di specificare separatamente nome e valore,
+inoltre il valore di \param{overwrite} ne specifica il comportamento nel caso
+la variabile esista già, sovrascrivendola se diverso da zero, lasciandola
+immutata se uguale a zero.
+
+Per cancellare una variabile di ambiente si usa \func{unsetenv}, che elimina
+ogni occorrenza della variabile, se questa non esiste non è considerato un
+errore. 
+
+
+
 
 
 \section{Problematiche di programmazione generica}
@@ -1109,6 +1175,7 @@ Il C per
 un'altra funzione, per cui se l'errore avviene in funzioni profondamente
 annidate occorre usare la funzioni \func{setjmp} e \func{longjmp}, il cui
 prototipo è:
+
 \begin{functions}
   \headdecl{setjmp.h}
   \funcdecl{void setjmp(jmp\_buf env)}
@@ -1119,14 +1186,14 @@ prototipo 
   
   La funzione ritorna zero quando è chiamata direttamente e un valore diverso
   da zero quando ritorna da una chiamata di \func{longjmp} che usa il contesto
-  salvato in predenza.
+  salvato in precedenza.
 
   \funcdecl{void longjmp(jmp\_buf env, int val)}
   
   Ripristina il contesto dello stack salvato dall'ultima chiamata di
   \func{setjmp} con l'argomento \param{env}. Il programma prosegue dal ritorno
   di \func{setjmp} con un valore \param{val}. Il valore di \param{val} deve
-  essere diverso da zero, se viene specficato 0 sarà usato 1 al suo posto.
+  essere diverso da zero, se viene specificato 0 sarà usato 1 al suo posto.
 
   La funzione non ritorna.
 \end{functions}