X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=5e30c7aa2b0a72c6dd88c07025e65f4b9c3811b7;hp=9f52a4203f5d1c842564a54cc015da1d994848dc;hb=dcf2c2df897955ff3503a7c426025457ab456fd7;hpb=b3593007c4edd76ecbf7386967c1b25d27eed828 diff --git a/process.tex b/process.tex index 9f52a42..5e30c7a 100644 --- a/process.tex +++ b/process.tex @@ -84,11 +84,11 @@ di \cmd{ld.so} e per un approfondimento dell'argomento si può consultare sez.~3.1.2 di \cite{AGL}. Una volta completate le operazioni di inizializzazione di \cmd{ld-linux.so}, il -sistema fa partire qualunque programma chiamando la funzione \func{main}. Sta +sistema fa partire qualunque programma chiamando la funzione \code{main}. Sta al programmatore chiamare così la funzione principale del programma da cui si suppone che inizi l'esecuzione. In ogni caso senza questa funzione lo stesso \textit{link-loader} darebbe luogo ad errori. Lo standard ISO C specifica che -la funzione \func{main} può non avere argomenti o prendere due argomenti che +la funzione \code{main} può non avere argomenti o prendere due argomenti che rappresentano gli argomenti passati da linea di comando (su cui torneremo in sez.~\ref{sec:proc_par_format}), in sostanza un prototipo che va sempre bene è il seguente: @@ -97,7 +97,7 @@ il seguente: \itindend{link-loader} In realtà nei sistemi Unix esiste un altro modo per definire la funzione -\func{main}, che prevede la presenza di un terzo argomento, \code{char +\code{main}, che prevede la presenza di un terzo argomento, \code{char *envp[]}, che fornisce l'\textsl{ambiente} del programma; questa forma però non è prevista dallo standard POSIX.1 per cui se si vogliono scrivere programmi portabili è meglio evitarla. Per accedere all'ambiente, come vedremo @@ -105,9 +105,9 @@ in sez.~\ref{sec:proc_environ} si usa in genere una variabile globale che viene sempre definita automaticamente. Ogni programma viene fatto partire mettendo in esecuzione il codice contenuto -nella funzione \func{main}, ogni altra funzione usata dal programma, che sia +nella funzione \code{main}, ogni altra funzione usata dal programma, che sia ottenuta da una libreria condivisa, o che sia direttamente definita nel -codice, dovrà essere invocata a partire dal codice di \func{main}. Nel caso di +codice, dovrà essere invocata a partire dal codice di \code{main}. Nel caso di funzioni definite nel programma occorre tenere conto che, nel momento stesso in cui si usano le librerie di sistema (vale a dire la \acr{glibc}) alcuni nomi sono riservati e non possono essere utilizzati. @@ -359,11 +359,11 @@ direttamente valori numerici. \label{sec:proc_conclusion} Normalmente un programma conclude la sua esecuzione quando si fa ritornare la -funzione \func{main}, si usa cioè l'istruzione \instruction{return} del +funzione \code{main}, si usa cioè l'istruzione \instruction{return} del linguaggio C all'interno della stessa, o se si richiede esplicitamente la chiusura invocando direttamente la funzione \func{exit}. Queste due modalità sono assolutamente equivalenti, dato che \func{exit} viene chiamata in maniera -trasparente anche quando \func{main} ritorna, passandogli come argomento il +trasparente anche quando \code{main} ritorna, passandogli come argomento il valore di ritorno (che essendo . La funzione \funcd{exit}, che è completamente generale, essendo definita dallo @@ -389,18 +389,18 @@ vedremo a breve) che completa la terminazione del processo. \itindbeg{exit~status} -Il valore dell'argomento \param{status} o il valore di ritorno di \func{main}, +Il valore dell'argomento \param{status} o il valore di ritorno di \code{main}, costituisce quello che viene chiamato lo \textsl{stato di uscita} (l'\textit{exit status}) del processo. In generale si usa questo valore per fornire al processo padre (come vedremo in sez.~\ref{sec:proc_wait}) delle informazioni generiche sulla riuscita o il fallimento del programma appena terminato. -Anche se l'argomento \param{status} (ed il valore di ritorno di \func{main}) +Anche se l'argomento \param{status} (ed il valore di ritorno di \code{main}) sono numeri interi di tipo \ctyp{int}, si deve tener presente che il valore dello stato di uscita viene comunque troncato ad 8 bit, per cui deve essere sempre compreso fra 0 e 255. Si tenga presente che se si -raggiunge la fine della funzione \func{main} senza ritornare esplicitamente si +raggiunge la fine della funzione \code{main} senza ritornare esplicitamente si ha un valore di uscita indefinito, è pertanto consigliabile di concludere sempre in maniera esplicita detta funzione. @@ -483,7 +483,7 @@ programma,\footnote{nel caso di \func{atexit} lo standard POSIX.1-2001 richiede che siano registrabili almeno \const{ATEXIT\_MAX} funzioni (il valore può essere ottenuto con \func{sysconf}, vedi sez.~\ref{sec:sys_sysconf}).} sia per la chiamata ad \func{exit} che per il -ritorno di \func{main}. La prima funzione che si può utilizzare a tal fine è +ritorno di \code{main}. La prima funzione che si può utilizzare a tal fine è \funcd{atexit}, il cui prototipo è: \begin{funcproto}{ \fhead{stdlib.h} \fdecl{void (*function)(void)} @@ -563,7 +563,7 @@ Allo stesso modo l'unico modo in cui un programma può concludere volontariamente la propria esecuzione è attraverso una chiamata alla \textit{system call} \func{\_exit}, sia che questa venga fatta esplicitamente, o in maniera indiretta attraverso l'uso di \func{exit} o il ritorno di -\func{main}. +\code{main}. Uno schema riassuntivo che illustra le modalità con cui si avvia e conclude normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. @@ -931,8 +931,8 @@ semplicemente allocati \param{size} byte e l'area di memoria non viene inizializzata. Una volta che non sia più necessaria la memoria allocata dinamicamente deve -essere esplicitamente rilasciata usando la funzione \func{free},\footnote{le - glibc provvedono anche una funzione \func{cfree} definita per compatibilità +essere esplicitamente rilasciata usando la funzione \funcd{free},\footnote{le + glibc provvedono anche una funzione \funcm{cfree} definita per compatibilità con SunOS, che è deprecata.} il suo prototipo è: \begin{funcproto}{ @@ -1693,7 +1693,7 @@ operazioni. Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando vengono lanciati e come accennato in sez.~\ref{sec:proc_main} questo viene effettuato attraverso gli argomenti \param{argc} e \param{argv} ricevuti nella -funzione \func{main} all'avvio del programma. Questi argomenti vengono passati +funzione \code{main} all'avvio del programma. Questi argomenti vengono passati al programma dalla shell o dal processo che esegue la \func{exec} (secondo le modalità che vedremo in sez.~\ref{sec:proc_exec}) quando questo viene messo in esecuzione. @@ -1780,7 +1780,7 @@ in \param{argv} la libreria standard del C fornisce la funzione \fhead{unistd.h} \fdecl{int getopt(int argc, char * const argv[], const char *optstring)} \fdesc{Esegue la scansione delle opzioni negli argomenti della funzione - \func{main}.} + \code{main}.} } {Ritorna il carattere che segue l'opzione, ``\texttt{:}'' se manca un parametro all'opzione, ``\texttt{?}'' se l'opzione è sconosciuta, e $-1$ se @@ -1788,7 +1788,7 @@ in \param{argv} la libreria standard del C fornisce la funzione \end{funcproto} Questa funzione prende come argomenti le due variabili \param{argc} e -\param{argv} che devono essere quelle passate come argomenti di \func{main} +\param{argv} che devono essere quelle passate come argomenti di \code{main} all'esecuzione del programma, ed una stringa \param{optstring} che indica quali sono le opzioni valide. La funzione effettua la scansione della lista degli argomenti ricercando ogni stringa che comincia con il carattere