From: Simone Piccardi Date: Tue, 20 Nov 2001 21:58:37 +0000 (+0000) Subject: Aggiunte funzioni di gestione per le varibili di ambiente X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=f5e0b5be624d5a5a0b7a414ec7e957b0f86b2a56;hp=e20a546af590a50e7ac47f68f6c7d4648bb4f31a Aggiunte funzioni di gestione per le varibili di ambiente --- diff --git a/macro.tex b/macro.tex index ad70c83..05509cc 100644 --- a/macro.tex +++ b/macro.tex @@ -66,7 +66,6 @@ tab.~\thechapter.\theusercount} % \newenvironment{prototype}[2] {% defining what is done by \begin - \par \center \footnotesize \begin{minipage}[c]{14cm} @@ -98,7 +97,6 @@ tab.~\thechapter.\theusercount} \newcommand{\funcdecl}[1]{\item\texttt{#1}\par} \newenvironment{functions} {% defining what is done by \begin - \par \footnotesize \center \begin{minipage}[c]{14cm} diff --git a/process.tex b/process.tex index ed4cb07..1ec1780 100644 --- a/process.tex +++ b/process.tex @@ -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,9 +991,10 @@ 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$ & Nome utente\\ @@ -1016,10 +1017,9 @@ anche altre: per una lista pi \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 -variabili 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}. @@ -1028,6 +1028,68 @@ variabili 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} @@ -1113,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)} diff --git a/prochand.tex b/prochand.tex index 0cda606..2707d09 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1331,8 +1331,7 @@ possono essere letti dal processo attraverso delle opportune funzioni, i cui prototipi sono i seguenti: \begin{functions} \headdecl{unistd.h} - \headdecl{sys/types.h} - + \headdecl{sys/types.h} \funcdecl{uid\_t getuid(void)} restituisce il \textit{real user ID} del processo corrente. @@ -1345,7 +1344,7 @@ prototipi sono i seguenti: \funcdecl{gid\_t getegid(void)} restituisce l'\textit{effective group ID} del processo corrente. - Queste funzioni non riportano condizioni di errore. + \noindent Queste funzioni non riportano condizioni di errore. \end{functions} In generale l'uso di privilegi superiori deve essere limitato il più