X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=c7bbfb73ae78e7a376b0e67d9ce638d2ca8bc31d;hp=db45209e4b70f4cf7ab749001fdf846a178958d3;hb=ffb12837c5ed8ccc095bc9c88349cd19b5e6b472;hpb=a896c0a874a06d086369f5cc3c7e6cf347671835 diff --git a/process.tex b/process.tex index db45209..c7bbfb7 100644 --- a/process.tex +++ b/process.tex @@ -73,10 +73,10 @@ Il funzionamento di \cmd{ld-linux.so} è controllato da alcune variabili di ambiente e dal contenuto del file \conffile{/etc/ld.so.conf}, che consentono di elencare le directory un cui cercare le librerie e determinare quali verranno utilizzate. In particolare con la variabile di ambiente -\texttt{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a +\envvar{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a quelle di sistema in cui inserire versioni personali delle librerie che hanno la precedenza su quelle di sistema, mentre con la variabile di ambiente -\texttt{LD\_PRELOAD} si può passare direttamente una lista di file di librerie +\envvar{LD\_PRELOAD} si può passare direttamente una lista di file di librerie condivise da usare al posto di quelli di sistema. In questo modo è possibile effettuare lo sviluppo o il test di nuove librerie senza dover sostituire quelle di sistema. Ulteriori dettagli sono riportati nella pagina di manuale @@ -142,7 +142,7 @@ evitarli, in particolare questi sono: il controllo e la conversione del tipo di caratteri, \item i nomi che iniziano con ``\texttt{LC\_}'' e costituiti da lettere maiuscole che possono essere usato per macro attinenti la - localizzazione (vedi sez.~\ref{sec:proc_localization}), + localizzazione,% mettere in seguito (vedi sez.~\ref{sec:proc_localization}), \item nomi che iniziano con ``\texttt{SIG}'' o ``\texttt{SIG\_}'' e costituiti da lettere maiuscole che potrebbero essere usati per nuovi nomi di segnale (vedi sez.~\ref{sec:sig_classification}), @@ -213,25 +213,27 @@ definizioni. & ANSI C& POSIX& \\ \hline \hline - \file{assert.h}&$\bullet$& -- & Verifica le asserzioni fatte in un - programma.\\ - \file{ctype.h} &$\bullet$& -- & Tipi standard.\\ - \file{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\ - \file{errno.h} & -- &$\bullet$& Errori di sistema.\\ - \file{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\ - \file{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\ - \file{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\ - \file{setjmp.h}&$\bullet$& -- & Salti non locali.\\ - \file{signal.h}& -- &$\bullet$& Gestione dei segnali.\\ - \file{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti - variabili.\\ - \file{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI C.\\ - \file{stdlib.h}&$\bullet$& -- & Definizioni della libreria standard.\\ - \file{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\ - \file{time.h} & -- &$\bullet$& Gestione dei tempi.\\ - \file{times.h} &$\bullet$& -- & Gestione dei tempi.\\ - \file{unistd.h}& -- &$\bullet$& Unix standard library.\\ - \file{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\ + \headfile{assert.h}&$\bullet$& -- & Verifica le asserzioni fatte in un + programma.\\ + \headfile{ctype.h} &$\bullet$& -- & Tipi standard.\\ + \headfile{dirent.h}& -- &$\bullet$& Manipolazione delle directory.\\ + \headfile{errno.h} & -- &$\bullet$& Errori di sistema.\\ + \headfile{fcntl.h} & -- &$\bullet$& Controllo sulle opzioni dei file.\\ + \headfile{limits.h}& -- &$\bullet$& Limiti e parametri del sistema.\\ + \headfile{malloc.h}&$\bullet$& -- & Allocazione della memoria.\\ + \headfile{setjmp.h}&$\bullet$& -- & Salti non locali.\\ + \headfile{signal.h}& -- &$\bullet$& Gestione dei segnali.\\ + \headfile{stdarg.h}&$\bullet$& -- & Gestione di funzioni a argomenti + variabili.\\ + \headfile{stdio.h} &$\bullet$& -- & I/O bufferizzato in standard ANSI + C.\\ + \headfile{stdlib.h}&$\bullet$& -- & Definizioni della libreria + standard.\\ + \headfile{string.h}&$\bullet$& -- & Manipolazione delle stringhe.\\ + \headfile{time.h} & -- &$\bullet$& Gestione dei tempi.\\ + \headfile{times.h} &$\bullet$& -- & Gestione dei tempi.\\ + \headfile{unistd.h}& -- &$\bullet$& Unix standard library.\\ + \headfile{utmp.h} & -- &$\bullet$& Registro connessioni utenti.\\ \hline \end{tabular} \caption{Elenco dei principali \textit{header file} definiti dagli standard @@ -255,24 +257,24 @@ parlato in sez.~\ref{sec:proc_main}, alcuni di questi \textit{header file} riservano degli ulteriori identificativi, il cui uso sarà da evitare, ad esempio si avrà che: \begin{itemize*} -\item in \file{dirent.h} vengono riservati i nomi che iniziano con +\item in \headfile{dirent.h} vengono riservati i nomi che iniziano con ``\texttt{d\_}'' e costituiti da lettere minuscole, -\item in \file{fcntl.h} vengono riservati i nomi che iniziano con +\item in \headfile{fcntl.h} vengono riservati i nomi che iniziano con ``\texttt{l\_}'', ``\texttt{F\_}'',``\texttt{O\_}'' e ``\texttt{S\_}'', -\item in \file{limits.h} vengono riservati i nomi che finiscono in +\item in \headfile{limits.h} vengono riservati i nomi che finiscono in ``\texttt{\_MAX}'', -\item in \file{signal.h} vengono riservati i nomi che iniziano con +\item in \headfile{signal.h} vengono riservati i nomi che iniziano con ``\texttt{sa\_}'' e ``\texttt{SA\_}'', -\item in \file{sys/stat.h} vengono riservati i nomi che iniziano con +\item in \headfile{sys/stat.h} vengono riservati i nomi che iniziano con ``\texttt{st\_}'' e ``\texttt{S\_}'', -\item in \file{sys/times.h} vengono riservati i nomi che iniziano con +\item in \headfile{sys/times.h} vengono riservati i nomi che iniziano con ``\texttt{tms\_}'', -\item in \file{termios.h} vengono riservati i nomi che iniziano con +\item in \headfile{termios.h} vengono riservati i nomi che iniziano con ``\texttt{c\_}'', ``\texttt{V}'', ``\texttt{I}'', ``\texttt{O}'' e ``\texttt{TC}'' e con ``\texttt{B}'' seguito da un numero, -\item in \file{grp.h} vengono riservati i nomi che iniziano con +\item in \headfile{grp.h} vengono riservati i nomi che iniziano con ``\texttt{gr\_}'', -\item in \file{pwd.h}vengono riservati i nomi che iniziano con +\item in \headfile{pwd.h}vengono riservati i nomi che iniziano con ``\texttt{pw\_}'', \end{itemize*} @@ -349,7 +351,7 @@ dall'architettura,\footnote{in genere le vecchie \textit{system call} non ciascuna \textit{system call} viene in genere identificata da una costante nella forma \texttt{SYS\_*} dove al prefisso viene aggiunto il nome che spesso corrisponde anche alla omonima funzione di libreria. Queste costanti sono -definite nel file \texttt{sys/syscall.h}, ma si possono anche usare +definite nel file \headfile{sys/syscall.h}, ma si possono anche usare direttamente valori numerici. @@ -422,7 +424,7 @@ un intero di valore generico può comportare il rischio, qualora si vada ad usare un multiplo di 256, di avere uno stato di uscita uguale a zero, che verrebbe interpretato come un successo. -Per questo motivo in \file{stdlib.h} sono definite, seguendo lo standard +Per questo motivo in \headfile{stdlib.h} sono definite, seguendo lo standard POSIX, le due costanti \const{EXIT\_SUCCESS} e \const{EXIT\_FAILURE}, da usare sempre per specificare lo stato di uscita di un processo. Su Linux, ed in generale in qualunque sistema POSIX, ad esse sono assegnati rispettivamente i @@ -432,7 +434,8 @@ valori 0 e 1. Una forma alternativa per effettuare una terminazione esplicita di un programma è quella di chiamare direttamente la \textit{system call} -\func{\_exit}, che restituisce il controllo direttamente al kernel, +\funcd{\_exit},\footnote{la stessa è definita anche come \funcd{\_Exit} in + \headfile{stdlib.h}.} che restituisce il controllo direttamente al kernel, concludendo immediatamente il processo, il suo prototipo è: \begin{funcproto}{ \fhead{unistd.h} \fdecl{void \_exit(int status)} @@ -570,7 +573,7 @@ normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. % \includegraphics[width=9cm]{img/proc_beginend} \begin{tikzpicture}[>=stealth] \filldraw[fill=black!35] (-0.3,0) rectangle (12,1); - \draw(5.5,0.5) node {\large{kernel}}; + \draw(5.5,0.5) node {\large{\textsf{kernel}}}; \filldraw[fill=black!15] (1.5,2) rectangle (4,3); \draw (2.75,2.5) node {\texttt{ld-linux.so}}; @@ -597,9 +600,9 @@ normalmente un programma è riportato in fig.~\ref{fig:proc_prog_start_stop}. \draw[->] (4,4.5) -- node[anchor=south]{\texttt{exit}} (exit); \draw[->] (exit) -- node[anchor=east]{\texttt{\_exit}}(6.75,1); - \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{exit handler}; - \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{exit handler}; - \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{chiusura stream}; + \draw (10,4.5) node (exithandler1) [rectangle,fill=black!15,rounded corners, draw]{\textsf{exit handler}}; + \draw (10,5.5) node (exithandler2) [rectangle,fill=black!15,rounded corners, draw]{\textsf{exit handler}}; + \draw (10,3.5) node (stream) [rectangle,fill=black!15,rounded corners, draw]{\textsf{chiusura stream}}; \draw[<->, dashed] (exithandler1) -- (exit); \draw[<->, dashed] (exithandler2) -- (exit); @@ -652,7 +655,7 @@ bit e di 8kb sulle alpha. Con le versioni più recenti del kernel è possibile anche utilizzare pagine di dimensioni maggiori (di 4Mb, dette \textit{huge page}), per sistemi con grandi quantitativi di memoria in cui l'uso di pagine troppo piccole comporta una perdita di prestazioni. In alcuni sistemi -la costante \const{PAGE\_SIZE}, definita in \file{limits.h}, indica la +la costante \const{PAGE\_SIZE}, definita in \headfile{limits.h}, indica la dimensione di una pagina in byte, con Linux questo non avviene e per ottenere questa dimensione si deve ricorrere alla funzione \func{getpagesize} (vedi sez.~\ref{sec:sys_memory_res}). @@ -1000,7 +1003,7 @@ blocco di dati ridimensionato. La \acr{glibc} ha un'implementazione delle funzioni di allocazione che è 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\_} +questo tipo di errori usando la variabile di ambiente \envvar{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 dei \itindex{double~free} \textit{double~free} o i @@ -1332,7 +1335,7 @@ automaticamente rimossi se si pone in esecuzione un altro programma con Il sistema pone dei limiti all'ammontare di memoria di un processo che può essere bloccata e al totale di memoria fisica che si può dedicare a questo, lo -standard POSIX.1 richiede che sia definita in \file{unistd.h} la macro +standard POSIX.1 richiede che sia definita in \headfile{unistd.h} la macro \macro{\_POSIX\_MEMLOCK\_RANGE} per indicare la capacità di eseguire il \textit{memory locking}. @@ -1536,9 +1539,9 @@ cosa che non è detto accada con altre implementazioni. Nessuna delle due funzioni ha una chiara standardizzazione e nessuna delle due compare in POSIX.1, inoltre ci sono indicazioni discordi sui file che ne contengono la definizione;\footnote{secondo SUSv2 \func{valloc} è definita in - \texttt{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} e - \acr{libc5} la dichiarano in \texttt{malloc.h}, lo stesso vale per - \func{memalign} che in alcuni sistemi è dichiarata in \texttt{stdlib.h}.} + \headfile{stdlib.h}, mentre sia le \acr{glibc} che le precedenti \acr{libc4} + e \acr{libc5} la dichiarano in \headfile{malloc.h}, lo stesso vale per + \func{memalign} che in alcuni sistemi è dichiarata in \headfile{stdlib.h}.} per questo motivo il loro uso è sconsigliato, essendo state sostituite dalla nuova \funcd{posix\_memalign}, che è stata standardizzata in POSIX.1d; il suo prototipo è: @@ -1583,8 +1586,8 @@ allocazione,\footnote{entrambe queste operazioni causano in genere la Abbiamo visto in sez.~\ref{sec:proc_mem_lock} come una prima funzionalità di ausilio nella ricerca di questi errori sia l'uso della variabile di ambiente -\var{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei controlli -di consistenza sullo stato delle allocazioni di memoria eseguite con +\envvar{MALLOC\_CHECK\_}. Una modalità alternativa per effettuare dei +controlli di consistenza sullo stato delle allocazioni di memoria eseguite con \func{malloc}, anche questa fornita come estensione specifica (e non standard) della \acr{glibc}, è quella di utilizzare la funzione \funcd{mcheck}, che deve essere chiamata prima di eseguire qualunque allocazione con \func{malloc}; il @@ -1945,17 +1948,18 @@ configurazione. É di norma cura della shell, quando esegue un comando, passare queste variabili al programma messo in esecuzione attraverso un uso opportuno delle relative chiamate (si veda sez.~\ref{sec:proc_exec}). -La shell ad esempio ne usa molte per il suo funzionamento, come \texttt{PATH} +La shell ad esempio ne usa molte per il suo funzionamento, come \envvar{PATH} per indicare la lista delle directory in cui effettuare la ricerca dei comandi -o \texttt{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come -\texttt{HOME}, \texttt{USER}, ecc. sono invece definite al login (per i +o \envvar{PS1} per impostare il proprio \textit{prompt}. Alcune di esse, come +\envvar{HOME}, \envvar{USER}, ecc. sono invece definite al login (per i dettagli si veda sez.~\ref{sec:sess_login}), ed in genere è cura della propria distribuzione definire le opportune variabili di ambiente in uno script di avvio. Alcune servono poi come riferimento generico per molti programmi, come -\texttt{EDITOR} che indica l'editor preferito da invocare in caso di -necessità. Una in particolare, \texttt{LANG}, serve a controllare la -localizzazione del programma (su cui torneremo in -sez.~\ref{sec:proc_localization}) per adattarlo alla lingua ed alle convezioni +\envvar{EDITOR} che indica l'editor preferito da invocare in caso di +necessità. Una in particolare, \envvar{LANG}, serve a controllare la +localizzazione del programma +%(su cui torneremo in sez.~\ref{sec:proc_localization}) +per adattarlo alla lingua ed alle convezioni dei vari paesi. Gli standard POSIX e XPG3 definiscono alcune di queste variabili (le più @@ -2180,20 +2184,20 @@ versione ``\textsl{sicura}'' da zero. \index{variabili!di~ambiente|)} -\subsection{La localizzazione} -\label{sec:proc_localization} +% \subsection{La localizzazione} +% \label{sec:proc_localization} -Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente -\texttt{LANG} sia usata per indicare ai processi il valore della cosiddetta -\textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie -di sistema\footnote{prenderemo in esame soltanto il caso della \acr{glibc}.} -che consente di gestire in maniera automatica sia la lingua in cui vengono -stampati i vari messaggi (come i messaggi associati agli errori che vedremo in -sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una -serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti -alfabetici, le espressioni della valute, ecc. +% Abbiamo accennato in sez.~\ref{sec:proc_environ} come la variabile di ambiente +% \envvar{LANG} sia usata per indicare ai processi il valore della cosiddetta +% \textsl{localizzazione}. Si tratta di una funzionalità fornita dalle librerie +% di sistema\footnote{prenderemo in esame soltanto il caso della \acr{glibc}.} +% che consente di gestire in maniera automatica sia la lingua in cui vengono +% stampati i vari messaggi (come i messaggi associati agli errori che vedremo in +% sez.~\ref{sec:sys_strerror}) che le convenzioni usate nei vari paesi per una +% serie di aspetti come il formato dell'ora, quello delle date, gli ordinamenti +% alfabetici, le espressioni della valute, ecc. -Da finire. +% Da finire. % La localizzazione di un programma si può selezionare con la @@ -2327,7 +2331,7 @@ adeguati. L'uso di una \textit{variadic function} prevede quindi tre punti: Lo standard ISO C prevede che una \textit{variadic function} abbia sempre almeno un argomento fisso. Prima di effettuare la dichiarazione deve essere -incluso l'apposito \textit{header file} \file{stdarg.h}; un esempio di +incluso l'apposito \textit{header file} \headfile{stdarg.h}; un esempio di dichiarazione è il prototipo della funzione \func{execl} che vedremo in sez.~\ref{sec:proc_exec}: \includecodesnip{listati/exec_sample.c} @@ -2361,7 +2365,7 @@ pertanto quella sequenziale, in cui vengono estratti dallo \itindex{stack} \textit{stack} secondo l'ordine in cui sono stati scritti nel prototipo della funzione. -Per fare questo in \file{stdarg.h} sono definite delle macro specifiche, +Per fare questo in \headfile{stdarg.h} sono definite delle macro specifiche, previste dallo standard ISO C89, che consentono di eseguire questa operazione. La prima di queste macro è \macro{va\_start}, che inizializza opportunamente una lista degli argomenti, la sua definizione è: