X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=d899675f0bbfe3411b486269ff45f7e0815ca686;hp=aac25b13ed16c0731c2728e15a77d0cb72b87063;hb=28d478465caab3b1ed140fd1a45c8a305f952be1;hpb=b7520f656813ad8056bdf95eb4d7b41c0292058e diff --git a/process.tex b/process.tex index aac25b1..d899675 100644 --- a/process.tex +++ b/process.tex @@ -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,91 @@ 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}. + + Entrambe 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 cancellare una variabile di ambiente si usa \func{unsetenv}, che elimina +ogni occorrenza della variabile, se la variabile specificata non esiste non +succede nulla, e non è previsto (dato che la funzione è \type{void}) nessuna +segnalazione di errore. + +Per modificare o aggiungere una variabile di ambiente si possono usare le +funzioni \func{setenv} e \func{putenv}. La prima permette di specificare +separatamente nome e valore della variabile di ambiente, inoltre il valore di +\param{overwrite} specifica il comportamento della funzione nel caso la +variabile esista già, sovrascrivendola se diverso da zero, lasciandola +immutata se uguale a zero. + +La seconda funzione prende come parametro una stringa analoga quella +restituita da \func{getenv}, e sempre nella forma \texttt{NOME=valore}. Se la +variabile specificata non esiste la stringa sarà aggiunta all'ambiente, se +invece esiste il suo valore sarà settato a quello specificato da +\func{string}. Si tenga presente che, seguendo lo standard SUSv2, le +\acr{glibc} successive alla versione 2.1.2 aggiungono\footnote{il + comportamento è lo stesso delle vecchie \acr{libc4} e \acr{libc5}; nelle + \acr{glibc}, dalla versione 2.0 alla 2.1.1, veniva invece fatta una copia, + seguendo il comportamento di BSD4.4; dato che questo può dar luogo a perdite + di memoria e non rispetta lo standard il comportamento è stato modificato a + partire dalle 2.1.2, eliminando anche, sempre in conformità a SUSv2, + l'attributo \type{const} dal prototipo.} \func{string} alla lista delle +variabili di ambiente; pertanto ogni cambiamento alla stringa in questione si +riflette automaticamente sull'ambiente, e quindi si deve evitare di passare +alla funzione variabili automatiche (per evitare i problemi esposti in +\secref{sec:proc_auto_var}). + +Si tenga infine presente che se si passa a \func{putenv} solo il nome di una +variabile (cioè \param{string} è nella forma \texttt{NAME} e non contiene un +\var{=}) allora questa viene cancellata dall'ambiente. Infine se la chiamata +di \func{putenv} comporta la necessità di allocare una nuova versione del +vettore \var{environ} questo sarà allocato, ma la versione corrente sarà +deallocata solo se anch'essa risultante da una allocazione fatta in precedenza +da un'altra \func{putenv}, il vettore originale (in genere piazzato al di +sopra dello stack, vedi \figref{fig:proc_mem_layout}), o la memoria associata +alle variabili di ambiente eliminate non viene comunque liberata. \section{Problematiche di programmazione generica} @@ -1109,6 +1198,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 +1209,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}