X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=aac25b13ed16c0731c2728e15a77d0cb72b87063;hp=e022c2ecd102bf31c3aaef6b9d78688a9ee73e11;hb=b7520f656813ad8056bdf95eb4d7b41c0292058e;hpb=f4469c536e047bd645eb84db1d5bed531ffde3b5 diff --git a/process.tex b/process.tex index e022c2e..aac25b1 100644 --- a/process.tex +++ b/process.tex @@ -33,6 +33,7 @@ posto in esecuzione esso apparir discorso dei \textit{thread} comunque in Linux necessita di una trattazione a parte per la peculiarità dell'implementazione). + \subsection{La funzione \func{main}} \label{sec:proc_main} @@ -233,11 +234,12 @@ Lo schema delle modalit \begin{figure}[htb] \centering - + \includegraphics[width=12cm]{img/proc_beginend} \caption{Schema dell'avvio e della conclusione di un programma.} \label{fig:proc_prog_start_stop} \end{figure} + Si ricordi infine che un programma può anche essere interrotto dall'esterno attraverso l'uso di un segnale (modalità di conclusione non mostrata in \curfig); torneremo su questo aspetto in \secref{cha:signals}. @@ -389,7 +391,7 @@ programma C viene suddiviso nei seguenti segmenti: \begin{figure}[htb] \centering - \includegraphics[width=5cm]{img/memory_layout.eps} + \includegraphics[width=5cm]{img/memory_layout} \caption{Disposizione tipica dei segmenti di memoria di un processo} \label{fig:proc_mem_layout} \end{figure} @@ -522,7 +524,7 @@ particolare: \begin{itemize*} \item se la variabile è posta a zero gli errori vengono ignorati. \item se è posta ad 1 viene stampato un avviso sullo \textit{standard error} - (vedi \secref{sec:file_stdfiles}). + (vedi \secref{sec:file_std_stream}). \item se è posta a 2 viene chiamata \func{abort}, che in genere causa l'immediata conclusione del programma. \end{itemize*} @@ -562,8 +564,8 @@ segmento di stack della funzione corrente. La sintassi di successo e \macro{NULL} in caso di fallimento, nel qual caso \var{errno} viene settata a \macro{ENOMEM}. \end{prototype} -ma in questo caso non è più necessario liberare la memoria in quanto questa -viene rilasciata automaticamente al ritorno della funzione. +\noindent ma in questo caso non è più necessario liberare la memoria in quanto +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; @@ -752,9 +754,9 @@ 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 +\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*} @@ -959,7 +961,7 @@ un esempio del contenuto dell'ambiente, in si variabili che normalmente sono definite dal sistema, è riportato in \nfig. \begin{figure}[htb] \centering - \includegraphics[width=11cm]{img/environ_var.eps} + \includegraphics[width=11cm]{img/environ_var} \caption{Esempio di lista delle variabili di ambiente.} \label{fig:proc_envirno_list} \end{figure} @@ -967,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 è @@ -985,8 +987,42 @@ 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$ & \\ + \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$ & \\ + \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 è: + +\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} @@ -1071,6 +1107,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 predenza. + \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. + + La funzione non ritorna. +\end{functions}