X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=ed4cb07879c6cb45c815df2f58bf61127140bbe6;hp=4b896d84a9ad984ac4d8367af6a47f8003128a58;hb=e20a546af590a50e7ac47f68f6c7d4648bb4f31a;hpb=90d696f5005a8ce307042cb6aabfff8335747380 diff --git a/process.tex b/process.tex index 4b896d8..ed4cb07 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} @@ -969,7 +969,7 @@ variabili che normalmente sono definite dal sistema, Per convenzione le stringhe che definiscono l'ambiente sono tutte del tipo \textsl{\texttt{nome=valore}}. Inoltre alcune variabili, come quelle elencate in \curfig, sono definite dal sistema per essere usate da diversi programmi e -funzioni: per queste c'è l'ulteriore convezione di usare nomi espressi in +funzioni: per queste c'è l'ulteriore convenzione di usare nomi espressi in caratteri maiuscoli. Il kernel non usa mai queste variabili, il loro uso e la loro interpretazione è @@ -987,8 +987,46 @@ l'editor preferito da invocare in caso di necessit Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più comuni), come riportato in \ntab. GNU/Linux le supporta tutte e ne definisce -anche altre: per una lista parziale si può controllare \cmd{man environ}. +anche altre: per una lista più completa si può controllare \cmd{man environ}. +\begin{table}[htb] + \centering + \begin{tabular}[c]{|l|c|c|c|p{6cm}|} + \hline + \textbf{Variabile} & POSIX & XPG & Linux & \textbf{Descrizione} \\ + \hline + \hline + \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 +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}. + + La funzione \macro{NULL} se non trova nulla, o il puntatore alla stringa che + corrisponde (di solito nella forma \texttt{NOME=valore}). +\end{prototype} @@ -1073,6 +1111,27 @@ efficiente, quello dell'uscita in caso di errore. Il C però non consente di effettuare un salto ad una label definita in un'altra funzione, per cui se l'errore avviene in funzioni profondamente -annidate occorre usare la funzione \func{longjump}. +annidate occorre usare la funzioni \func{setjmp} e \func{longjmp}, il cui +prototipo è: +\begin{functions} + \headdecl{setjmp.h} + \funcdecl{void setjmp(jmp\_buf env)} + + La funzione salva il contesto dello stack in \param{env} per un successivo + uso da parte di \func{longjmp}. Il contesto viene invalidato se la routine + che ha chiamato \func{setjmp} ritorna. + + 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 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 specificato 0 sarà usato 1 al suo posto. + La funzione non ritorna. +\end{functions}