From e2a6afe2653d1b051226abbcf8d398b3787c4d41 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 29 Sep 2009 22:12:19 +0000 Subject: [PATCH] Risistemazione argomenti, opzioni ed ambiente e predisposizione prctl --- process.tex | 117 +++++++++++++++++++++++++++------------------------- system.tex | 1 + 2 files changed, 62 insertions(+), 56 deletions(-) diff --git a/process.tex b/process.tex index eeebf6c..aa75ea3 100644 --- a/process.tex +++ b/process.tex @@ -619,12 +619,12 @@ che, quando l'argomento operazione. Le \acr{glibc} hanno un'implementazione delle funzioni di allocazione che è -controllabile dall'utente attraverso alcune variabili di ambiente, in -particolare diventa possibile tracciare questo tipo di errori usando la -variabile di ambiente \val{MALLOC\_CHECK\_} che quando viene definita mette in -uso una versione meno efficiente delle funzioni suddette, che però è più -tollerante nei confronti di piccoli errori come quello di chiamate doppie a -\func{free}. In particolare: +controllabile dall'utente attraverso alcune variabili di ambiente (vedi +sez.~\ref{sec:proc_environ}), in particolare diventa possibile tracciare +questo tipo di errori usando la variabile di ambiente \val{MALLOC\_CHECK\_} +che quando viene definita mette in uso una versione meno efficiente delle +funzioni suddette, che però è più tollerante nei confronti di piccoli errori +come quello di chiamate doppie a \func{free}. In 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} @@ -693,12 +693,12 @@ molto complesse riguardo l'allocazione della memoria. Vedremo alcune delle funzionalità di ausilio presenti nelle \acr{glibc} in sez.~\ref{sec:proc_memory_adv_management}. -Una possibile alternativa all'uso di \func{malloc}, che non soffre dei -problemi di \itindex{memory~leak} \textit{memory leak} descritti in -precedenza, è la funzione \funcd{alloca}, che invece di allocare la memoria -nello \itindex{heap} \textit{heap} usa il segmento di \itindex{stack} -\textit{stack} della funzione corrente. La sintassi è identica a quella di -\func{malloc}, il suo prototipo è: +Una possibile alternativa all'uso di \func{malloc}, per evitare di soffrire +dei problemi di \itindex{memory~leak} \textit{memory leak} descritti in +precedenza, è di allocare la memoria nel segmento di \itindex{stack} +\textit{stack} della funzione corrente invece che nello \itindex{heap} +\textit{heap}, per farlo si può usare la funzione \funcd{alloca}, la cui +sintassi è identica a quella di \func{malloc}; il suo prototipo è: \begin{prototype}{stdlib.h}{void *alloca(size\_t size)} Alloca \param{size} byte nello \textit{stack}. @@ -1138,16 +1138,15 @@ oltre le dimensioni della sua allocazione,\footnote{entrambe queste operazioni classici \itindex{memory~leak} \textit{memory leak}. Una prima funzionalità di ausilio nella ricerca di questi errori viene fornita -dalla \acr{glibc} tramite l'uso della variabile di ambiente (vedi -sez.~\ref{sec:proc_environ}) \var{MALLOC\_CHECK\_}. Quando questa viene -definita al posto della versione ordinaria delle funzioni di allocazione -(\func{malloc}, \func{calloc}, \func{realloc}, e \func{free}) viene usata una -versione meno efficiente ma in grado di rilevare (e tollerare) alcuni degli -errori più semplici, come le doppie chiamate a \func{free} o i -\itindex{buffer~overrun} \textit{buffer overrun} di un byte.\footnote{uno - degli errori più comuni, causato ad esempio dalla scrittura di una stringa - di dimensione pari a quella del buffer, in cui ci si dimentica dello zero di - terminazione finale.} +dalla \acr{glibc} tramite l'uso della variabile di ambiente +\var{MALLOC\_CHECK\_}. Quando questa viene definita al posto della versione +ordinaria delle funzioni di allocazione (\func{malloc}, \func{calloc}, +\func{realloc}, e \func{free}) viene usata una versione meno efficiente ma in +grado di rilevare (e tollerare) alcuni degli errori più semplici, come le +doppie chiamate a \func{free} o i \itindex{buffer~overrun} \textit{buffer + overrun} di un byte.\footnote{uno degli errori più comuni, causato ad + esempio dalla scrittura di una stringa di dimensione pari a quella del + buffer, in cui ci si dimentica dello zero di terminazione finale.} In questo caso a seconda del valore assegnato a \var{MALLOC\_CHECK\_} si avranno diversi comportamenti: con 0 l'errore sarà ignorato, con 1 verrà @@ -1239,37 +1238,35 @@ controllo non % a sostituire mallinfo, vedi http://udrepper.livejournal.com/20948.html -\section{Argomenti, opzioni ed ambiente di un processo} +\section{Argomenti, ambiente ed altre proprietà di un processo} \label{sec:proc_options} -Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando -vengono lanciati. Il passaggio degli argomenti è effettuato attraverso gli -argomenti \param{argc} e \param{argv} della funzione \func{main}, che 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. - -Oltre al passaggio degli argomenti, un'altra modalità che permette di passare -delle informazioni che modifichino il comportamento di un programma è quello -dell'uso del cosiddetto \textit{environment} (cioè l'uso delle -\textsl{variabili di ambiente}). In questa sezione esamineremo le funzioni che -permettono di gestire argomenti ed opzioni, e quelle che consentono di -manipolare ed utilizzare le variabili di ambiente. Accenneremo infine alle -modalità con cui si può gestire la localizzazione di un programma -modificandone il comportamento a seconda della lingua o del paese a cui si -vuole faccia riferimento nelle sue operazioni. +In questa sezione esamineremo le funzioni che permettono di gestire gli +argomenti e le opzioni, e quelle che consentono di manipolare ed utilizzare le +variabili di ambiente. Accenneremo infine alle modalità con cui si può gestire +la localizzazione di un programma modificandone il comportamento a seconda +della lingua o del paese a cui si vuole faccia riferimento nelle sue +operazioni. \subsection{Il formato degli argomenti} \label{sec:proc_par_format} -In genere il passaggio degli argomenti ad un programma viene effettuato dalla -shell, che si incarica di leggere la linea di comando e di effettuarne la -scansione (il cosiddetto \textit{parsing}) per individuare le parole che la -compongono, ciascuna delle quali viene considerata un argomento. Di norma per -individuare le parole che andranno a costituire la lista degli argomenti viene -usato come carattere di separazione lo spazio o il tabulatore, ma la cosa -dipende ovviamente dalle modalità con cui si effettua il lancio. +Tutti i programmi hanno la possibilità di ricevere argomenti e opzioni quando +vengono lanciati. Il passaggio degli argomenti e delle opzioni è effettuato +attraverso gli argomenti \param{argc} e \param{argv} della funzione +\func{main}, che 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. + +In genere il passaggio di argomenti ed opzioni ad un programma viene +effettuato dalla shell, che si incarica di leggere la linea di comando e di +effettuarne la scansione (il cosiddetto \textit{parsing}) per individuare le +parole che la compongono, ciascuna delle quali potrà essere considerata un +argomento o un'opzione. Di norma per individuare le parole che andranno a +costituire la lista degli argomenti viene usato come carattere di separazione +lo spazio o il tabulatore, ma la cosa dipende ovviamente dalle modalità con +cui si effettua la scansione. \begin{figure}[htb] \centering @@ -1281,9 +1278,9 @@ dipende ovviamente dalle modalit Indipendentemente da come viene eseguita, il risultato della scansione deve essere la costruzione del vettore di puntatori \param{argv} in cui si devono -inserire in successione i puntatori alle stringhe costituenti i vari -argomenti, e della variabile \param{argc} che deve essere inizializzata al -numero di argomenti trovati. Nel caso della shell questo comporta che il primo +inserire in successione i puntatori alle stringhe costituenti i vari argomenti +ed opzioni, e della variabile \param{argc} che deve essere inizializzata al +numero di stringhe passate. Nel caso della shell questo comporta che il primo argomento sia sempre il nome del programma; un esempio di questo meccanismo è mostrato in fig.~\ref{fig:proc_argv_argc}. @@ -1394,13 +1391,20 @@ vettore \param{argv}. \subsection{Le variabili di ambiente} \label{sec:proc_environ} -Oltre agli argomenti passati a linea di comando ogni processo riceve dal -sistema un \textsl{ambiente}, nella forma di una lista di variabili (detta -\textit{environment list}) messa a disposizione dal processo, e costruita -nella chiamata alla funzione \func{exec} quando questo viene lanciato. - -Come per la lista degli argomenti anche questa lista è un vettore di puntatori -a caratteri, ciascuno dei quali punta ad una stringa, terminata da un +Oltre agli argomenti passati a linea di comando esiste un'altra modalità che +permette di trasferire ad un processo delle informazioni in modo da +modificarne il comportamento. Ogni processo infatti riceve dal sistema, oltre +alle variabili \param{argv} e \param{argc} anche un \textsl{ambiente} (in +inglese \textit{environment}); questo viene espresso nella forma di una lista +(chiamata \textit{environment list}) delle cosiddette \textsl{variabili di + ambiente}, i valori di queste variabili possono essere poi usati dal +programma. + +Anche in questo caso la lista delle \textsl{variabili di ambiente} deve essere +costruita ed utilizzata nella chiamata alla funzione \func{exec} (torneremo su +questo in sez.~\ref{sec:proc_exec}) quando questo viene lanciato. Come per la +lista degli argomenti anche questa lista è un vettore di puntatori a +caratteri, ciascuno dei quali punta ad una stringa, terminata da un \val{NULL}. A differenza di \code{argv[]} in questo caso non si ha una lunghezza del vettore data da un equivalente di \param{argc}, ma la lista è terminata da un puntatore nullo. @@ -1646,6 +1650,7 @@ In realt % TODO trattare, quando ci sarà tempo, setlocale ed il resto + %\subsection{Opzioni in formato esteso} %\label{sec:proc_opt_extended} diff --git a/system.tex b/system.tex index 96c1003..74f21c3 100644 --- a/system.tex +++ b/system.tex @@ -559,6 +559,7 @@ lettura. Affronteremo questi argomenti in questa sezione, insieme alle funzioni che si usano per il controllo di altre caratteristiche generali del sistema, come quelle per la gestione dei filesystem e di utenti e gruppi. +% TODO ristrutturare e aggiungere \func{prctl} \subsection{La funzione \func{sysctl} ed il filesystem \file{/proc}} \label{sec:sys_sysctl} -- 2.30.2