X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=6fa1b86e6ce36e344cfa2a900900de26ff170c07;hp=a663b9f489550b48cafaf4839c7cfcc83ea84d58;hb=428bc5cd4e05a99bbcb57be6946eb4b1fa9dfca9;hpb=3b7696e141a7c9c5d9ddec1654aa2a1108350bde diff --git a/prochand.tex b/prochand.tex index a663b9f..6fa1b86 100644 --- a/prochand.tex +++ b/prochand.tex @@ -116,7 +116,7 @@ Dato che tutti i processi attivi nel sistema sono comunque generati da \cmd{init} o da uno dei suoi figli\footnote{in realtà questo non è del tutto vero, in Linux ci sono alcuni processi speciali che pur comparendo come figli di \cmd{init}, o con \acr{pid} successivi, sono in realtà generati - direttamente dal kernel, (come \cmd{keventd}, \cmd{kswapd}, etc.).} si + direttamente dal kernel, (come \cmd{keventd}, \cmd{kswapd}, ecc.).} si possono classificare i processi con la relazione padre/figlio in un'organizzazione gerarchica ad albero, in maniera analoga a come i file sono organizzati in un albero di directory (si veda @@ -400,8 +400,8 @@ degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione descrizione delle opzioni); il codice completo, compresa la parte che gestisce le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c}, distribuito insieme agli altri sorgenti degli esempi su -\href{http://gapil.firenze.linux.it/gapil_source.tgz} -{\texttt{http://gapil.firenze.linux.it/gapil\_source.tgz}}. +\href{http://gapil.truelite.it/gapil_source.tgz} +{\textsf{http://gapil.truelite.it/gapil\_source.tgz}}. Decifrato il numero di figli da creare, il ciclo principale del programma (\texttt{\small 24--40}) esegue in successione la creazione dei processi figli @@ -587,34 +587,34 @@ comune dopo l'esecuzione di una \func{fork} \begin{itemize*} \item i file aperti e gli eventuali flag di \textit{close-on-exec}\index{\textit{close-on-exec}} impostati (vedi - sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}). + sez.~\ref{sec:proc_exec} e sez.~\ref{sec:file_fcntl}); \item gli identificatori per il controllo di accesso: l'\textsl{user-ID reale}, il \textsl{group-ID reale}, l'\textsl{user-ID effettivo}, il \textsl{group-ID effettivo} ed i \textit{group-ID supplementari} (vedi - sez.~\ref{sec:proc_access_id}). + sez.~\ref{sec:proc_access_id}); \item gli identificatori per il controllo di sessione: il \textit{process group-ID} e il \textit{session id} ed il terminale di controllo (vedi - sez.~\ref{sec:sess_proc_group}). + sez.~\ref{sec:sess_proc_group}); \item la directory di lavoro e la directory radice (vedi - sez.~\ref{sec:file_work_dir} e sez.~\ref{sec:file_chroot}). -\item la maschera dei permessi di creazione (vedi sez.~\ref{sec:file_umask}). + sez.~\ref{sec:file_work_dir} e sez.~\ref{sec:file_chroot}); +\item la maschera dei permessi di creazione (vedi sez.~\ref{sec:file_umask}); \item la maschera dei segnali bloccati (vedi sez.~\ref{sec:sig_sigmask}) e le - azioni installate (vedi sez.~\ref{sec:sig_gen_beha}). + azioni installate (vedi sez.~\ref{sec:sig_gen_beha}); \item i segmenti di memoria condivisa agganciati al processo (vedi - sez.~\ref{sec:ipc_sysv_shm}). -\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}). + sez.~\ref{sec:ipc_sysv_shm}); +\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}); \item le variabili di ambiente (vedi sez.~\ref{sec:proc_environ}). \end{itemize*} -le differenze fra padre e figlio dopo la \func{fork} invece sono: +Le differenze fra padre e figlio dopo la \func{fork} invece sono: \begin{itemize*} -\item il valore di ritorno di \func{fork}. -\item il \acr{pid} (\textit{process id}). +\item il valore di ritorno di \func{fork}; +\item il \acr{pid} (\textit{process id}); \item il \acr{ppid} (\textit{parent process id}), quello del figlio viene - impostato al \acr{pid} del padre. + impostato al \acr{pid} del padre; \item i valori dei tempi di esecuzione della struttura \struct{tms} (vedi - sez.~\ref{sec:sys_cpu_times}) che nel figlio sono posti a zero. + sez.~\ref{sec:sys_cpu_times}) che nel figlio sono posti a zero; \item i \textit{lock} sui file (vedi sez.~\ref{sec:file_locking}), che non - vengono ereditati dal figlio. + vengono ereditati dal figlio; \item gli allarmi ed i segnali pendenti (vedi sez.~\ref{sec:sig_gen_beha}), che per il figlio vengono cancellati. \end{itemize*} @@ -640,11 +640,11 @@ venne introdotta in BSD per migliorare le prestazioni. Dato che Linux supporta il \textit{copy on write}\index{\textit{copy~on~write}} la perdita di prestazioni è assolutamente trascurabile, e l'uso di questa funzione (che resta un caso -speciale della system call \func{\_\_clone}), è deprecato; per questo -eviteremo di trattarla ulteriormente. +speciale della system call \func{\_\_clone}) è deprecato; per questo eviteremo +di trattarla ulteriormente. -\subsection{La conclusione di un processo.} +\subsection{La conclusione di un processo} \label{sec:proc_termination} In sez.~\ref{sec:proc_conclusion} abbiamo già affrontato le modalità con cui @@ -671,16 +671,16 @@ comunque una serie di operazioni: chiude tutti i file aperti, rilascia la memoria che stava usando, e così via; l'elenco completo delle operazioni eseguite alla chiusura di un processo è il seguente: \begin{itemize*} -\item tutti i file descriptor sono chiusi. -\item viene memorizzato lo stato di terminazione del processo. +\item tutti i file descriptor sono chiusi; +\item viene memorizzato lo stato di terminazione del processo; \item ad ogni processo figlio viene assegnato un nuovo padre (in genere - \cmd{init}). + \cmd{init}); \item viene inviato il segnale \const{SIGCHLD} al processo padre (vedi - sez.~\ref{sec:sig_sigchld}). + sez.~\ref{sec:sig_sigchld}); \item se il processo è un leader di sessione ed il suo terminale di controllo è quello della sessione viene mandato un segnale di \const{SIGHUP} a tutti i processi del gruppo di foreground e il terminale di controllo viene - disconnesso (vedi sez.~\ref{sec:sess_ctrl_term}). + disconnesso (vedi sez.~\ref{sec:sess_ctrl_term}); \item se la conclusione di un processo rende orfano un \textit{process group} ciascun membro del gruppo viene bloccato, e poi gli vengono inviati in successione i segnali \const{SIGHUP} e \const{SIGCONT} @@ -959,26 +959,32 @@ generato dalla terminazione di un figlio, avremo la certezza che la chiamata a \hline \hline \macro{WIFEXITED(s)} & Condizione vera (valore non nullo) per un processo - figlio che sia terminato normalmente. \\ + figlio che sia terminato normalmente. \\ \macro{WEXITSTATUS(s)} & Restituisce gli otto bit meno significativi dello - stato di uscita del processo (passato attraverso \func{\_exit}, \func{exit} - o come valore di ritorno di \func{main}). Può essere valutata solo se - \val{WIFEXITED} ha restituito un valore non nullo.\\ + stato di uscita del processo (passato attraverso + \func{\_exit}, \func{exit} o come valore di + ritorno di \func{main}). Può essere valutata solo + se \val{WIFEXITED} ha restituito un valore non + nullo.\\ \macro{WIFSIGNALED(s)} & Vera se il processo figlio è terminato - in maniera anomala a causa di un segnale che non è stato catturato (vedi - sez.~\ref{sec:sig_notification}).\\ - \macro{WTERMSIG(s)} & restituisce il numero del segnale che ha causato - la terminazione anomala del processo. Può essere valutata solo se - \val{WIFSIGNALED} ha restituito un valore non nullo.\\ + in maniera anomala a causa di un segnale che non + è stato catturato (vedi + sez.~\ref{sec:sig_notification}).\\ + \macro{WTERMSIG(s)} & Restituisce il numero del segnale che ha causato + la terminazione anomala del processo. Può essere + valutata solo se \val{WIFSIGNALED} ha restituito + un valore non nullo.\\ \macro{WCOREDUMP(s)} & Vera se il processo terminato ha generato un - file si \textit{core dump}. Può essere valutata solo se - \val{WIFSIGNALED} ha restituito un valore non nullo.\footnotemark \\ + file di \textit{core dump}. Può essere valutata + solo se \val{WIFSIGNALED} ha restituito un valore + non nullo.\footnotemark \\ \macro{WIFSTOPPED(s)} & Vera se il processo che ha causato il ritorno di - \func{waitpid} è bloccato. L'uso è possibile solo avendo specificato - l'opzione \const{WUNTRACED}. \\ - \macro{WSTOPSIG(s)} & restituisce il numero del segnale che ha bloccato - il processo, Può essere valutata solo se \val{WIFSTOPPED} ha - restituito un valore non nullo. \\ + \func{waitpid} è bloccato. L'uso è possibile solo + avendo specificato l'opzione \const{WUNTRACED}. \\ + \macro{WSTOPSIG(s)} & Restituisce il numero del segnale che ha bloccato + il processo. Può essere valutata solo se + \val{WIFSTOPPED} ha restituito un valore non + nullo. \\ \hline \end{tabular} \caption{Descrizione delle varie macro di preprocessore utilizzabili per @@ -1026,8 +1032,8 @@ sono: \headdecl{sys/times.h} \headdecl{sys/types.h} \headdecl{sys/wait.h} \headdecl{sys/resource.h} - \funcdecl{pid\_t wait4(pid\_t pid, int * status, int options, struct rusage - * rusage)} + \funcdecl{pid\_t wait4(pid\_t pid, int *status, int options, struct rusage + *rusage)} È identica a \func{waitpid} sia per comportamento che per i valori degli argomenti, ma restituisce in \param{rusage} un sommario delle risorse usate dal processo. @@ -1075,14 +1081,14 @@ famiglia di funzioni) che possono essere usate per questo compito, in realt riconosciuto come tale, o compilato per un'altra architettura. \item[\errcode{ENOENT}] il file o una delle librerie dinamiche o l'interprete necessari per eseguirlo non esistono. - \item[\errcode{ETXTBSY}] L'eseguibile è aperto in scrittura da uno o più + \item[\errcode{ETXTBSY}] l'eseguibile è aperto in scrittura da uno o più processi. - \item[\errcode{EINVAL}] L'eseguibile ELF ha più di un segmento + \item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un interprete. - \item[\errcode{ELIBBAD}] Un interprete ELF non è in un formato + \item[\errcode{ELIBBAD}] un interprete ELF non è in un formato riconoscibile. - \item[\errcode{E2BIG}] La lista degli argomenti è troppo grande. + \item[\errcode{E2BIG}] la lista degli argomenti è troppo grande. \end{errlist} ed inoltre anche \errval{EFAULT}, \errval{ENOMEM}, \errval{EIO}, \errval{ENAMETOOLONG}, \errval{ELOOP}, \errval{ENOTDIR}, \errval{ENFILE}, @@ -1097,8 +1103,8 @@ argomenti e dell'ambiente possono essere acceduti dal nuovo programma quando la sua funzione \func{main} è dichiarata nella forma \code{main(int argc, char *argv[], char *envp[])}. -Le altre funzioni della famiglia servono per fornire all'utente una serie -possibile di diverse interfacce per la creazione di un nuovo processo. I loro +Le altre funzioni della famiglia servono per fornire all'utente una serie di +possibili diverse interfacce per la creazione di un nuovo processo. I loro prototipi sono: \begin{functions} \headdecl{unistd.h} @@ -1153,8 +1159,8 @@ per indicare il nome del file che contiene il programma che verr argomenti a lista &$\bullet$&$\bullet$&$\bullet$&&& \\ argomenti a vettore &&&&$\bullet$&$\bullet$&$\bullet$\\ \hline - filename completo &&$\bullet$&&&$\bullet$& \\ - ricerca su \var{PATH}&$\bullet$&&$\bullet$&$\bullet$&&$\bullet$ \\ + filename completo &$\bullet$&&$\bullet$&$\bullet$&&$\bullet$\\ + ricerca su \var{PATH} &&$\bullet$&&&$\bullet$& \\ \hline ambiente a vettore &&&$\bullet$&&&$\bullet$ \\ uso di \var{environ} &$\bullet$&$\bullet$&&$\bullet$&$\bullet$& \\ @@ -1203,21 +1209,21 @@ Oltre a mantenere lo stesso \acr{pid}, il nuovo programma fatto partire da la lista completa è la seguente: \begin{itemize*} \item il \textit{process id} (\acr{pid}) ed il \textit{parent process id} - (\acr{ppid}). + (\acr{ppid}); \item l'\textsl{user-ID reale}, il \textit{group-ID reale} ed i - \textsl{group-ID supplementari} (vedi sez.~\ref{sec:proc_access_id}). + \textsl{group-ID supplementari} (vedi sez.~\ref{sec:proc_access_id}); \item il \textit{session id} (\acr{sid}) ed il \textit{process group-ID} - (\acr{pgid}), vedi sez.~\ref{sec:sess_proc_group}. -\item il terminale di controllo (vedi sez.~\ref{sec:sess_ctrl_term}). -\item il tempo restante ad un allarme (vedi sez.~\ref{sec:sig_alarm_abort}). + (\acr{pgid}), vedi sez.~\ref{sec:sess_proc_group}; +\item il terminale di controllo (vedi sez.~\ref{sec:sess_ctrl_term}); +\item il tempo restante ad un allarme (vedi sez.~\ref{sec:sig_alarm_abort}); \item la directory radice e la directory di lavoro corrente (vedi - sez.~\ref{sec:file_work_dir}). + sez.~\ref{sec:file_work_dir}); \item la maschera di creazione dei file (\var{umask}, vedi sez.~\ref{sec:file_umask}) ed i \textit{lock} sui file (vedi - sez.~\ref{sec:file_locking}). + sez.~\ref{sec:file_locking}); \item i segnali sospesi (\textit{pending}) e la maschera dei segnali (si veda - sez.~\ref{sec:sig_sigmask}). -\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}). + sez.~\ref{sec:sig_sigmask}); +\item i limiti sulle risorse (vedi sez.~\ref{sec:sys_resource_limit}); \item i valori delle variabili \var{tms\_utime}, \var{tms\_stime}, \var{tms\_cutime}, \var{tms\_ustime} (vedi sez.~\ref{sec:sys_cpu_times}). \end{itemize*} @@ -1254,17 +1260,17 @@ bit impostato, in questo caso l'\textsl{user-ID effettivo} ed il gruppo cui il file appartiene (per i dettagli vedi sez.~\ref{sec:proc_perms}). Se il file da eseguire è in formato \emph{a.out} e necessita di librerie -condivise, viene lanciato il \textit{linker} dinamico \cmd{ld.so} prima del -programma per caricare le librerie necessarie ed effettuare il link +condivise, viene lanciato il \textit{linker} dinamico \cmd{/lib/ld.so} prima +del programma per caricare le librerie necessarie ed effettuare il link dell'eseguibile. Se il programma è in formato ELF per caricare le librerie dinamiche viene usato l'interprete indicato nel segmento \const{PT\_INTERP}, in genere questo è \file{/lib/ld-linux.so.1} per programmi linkati con le \acr{libc5}, e \file{/lib/ld-linux.so.2} per programmi linkati con le -\acr{glibc}. Infine nel caso il file sia uno script esso deve iniziare con -una linea nella forma \cmd{\#!/path/to/interpreter} dove l'interprete indicato -deve esse un programma valido (binario, non un altro script) che verrà -chiamato come se si fosse eseguito il comando \cmd{interpreter [argomenti] - filename}. +\acr{glibc}. Infine nel caso il file sia uno script esso deve iniziare con una +linea nella forma \cmd{\#!/path/to/interpreter [argomenti]} dove l'interprete +indicato deve essere un programma valido (binario, non un altro script) che +verrà chiamato come se si fosse eseguito il comando \cmd{interpreter + [argomenti] filename}. Con la famiglia delle \func{exec} si chiude il novero delle funzioni su cui è basata la gestione dei processi in Unix: con \func{fork} si crea un nuovo @@ -2258,8 +2264,9 @@ zero Lo standard POSIX.1b prevede comunque che i due valori della massima e minima priorità statica possano essere ottenuti, per ciascuna delle politiche di -scheduling realtime, tramite le due funzioni \funcd{sched\_get\_priority\_max} -e \funcd{sched\_get\_priority\_min}, i cui prototipi sono: +scheduling \textit{real-time}, tramite le due funzioni +\funcd{sched\_get\_priority\_max} e \funcd{sched\_get\_priority\_min}, i cui +prototipi sono: \begin{functions} \headdecl{sched.h}