X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=prochand.tex;h=76b801cf579002a154d005149b8a08a0ed2d7dce;hb=ee800a27585aeed2f753222dc5ff56fe0bcfb6e0;hp=87daec107401399f1123f11e1473cb0a845c7d73;hpb=8088f2df8bef63d425b42fa72f1f863345ec7ac8;p=gapil.git diff --git a/prochand.tex b/prochand.tex index 87daec1..76b801c 100644 --- a/prochand.tex +++ b/prochand.tex @@ -1,6 +1,6 @@ %% prochand.tex %% -%% Copyright (C) 2000-2011 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2012 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -75,7 +75,7 @@ struttura del sistema comunque consente di lanciare al posto di \cmd{init} qualunque altro programma, e in casi di emergenza (ad esempio se il file di \cmd{init} si fosse corrotto) è ad esempio possibile lanciare una shell al suo posto.\footnote{la cosa si fa passando la riga \cmd{init=/bin/sh} come - parametro di avvio del kernel, l'argomento è di natura amministrativa e + parametro di avvio del kernel, l'argomento è di natura sistemistica e trattato in sez.~5.3 di \cite{AGL}.} \begin{figure}[!htb] @@ -232,18 +232,18 @@ identificativi possono essere ottenuti usando le due funzioni \funcd{getpid} e \end{funcproto} \noindent esempi dell'uso di queste funzioni sono riportati in -fig.~\ref{fig:proc_fork_code}, nel programma \file{ForkTest.c}. +fig.~\ref{fig:proc_fork_code}, nel programma \file{fork\_test.c}. Il fatto che il \ids{PID} sia un numero univoco per il sistema lo rende un candidato per generare ulteriori indicatori associati al processo di cui diventa possibile garantire l'unicità: ad esempio in alcune implementazioni la funzione \func{tempnam} (si veda sez.~\ref{sec:file_temp_file}) usa il -\ids{PID} per generare un \itindex{pathname} \textit{pathname} univoco, che -non potrà essere replicato da un altro processo che usi la stessa -funzione. Questo utilizzo però può risultare pericoloso, un \ids{PID} infatti -è univoco solo fintanto che un processo è attivo, una volta terminato esso -potrà essere riutilizzato da un processo completamente diverso, e di questo -bisogna essere ben consapevoli. +\ids{PID} per generare un \textit{pathname} univoco, che non potrà essere +replicato da un altro processo che usi la stessa funzione. Questo utilizzo +però può risultare pericoloso, un \ids{PID} infatti è univoco solo fintanto +che un processo è attivo, una volta terminato esso potrà essere riutilizzato +da un processo completamente diverso, e di questo bisogna essere ben +consapevoli. Tutti i processi figli dello stesso processo padre sono detti \textit{sibling}, questa è una delle relazioni usate nel \textsl{controllo di @@ -370,10 +370,11 @@ del nuovo programma. \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{\codesamplewidth} - \includecodesample{listati/ForkTest.c} + \includecodesample{listati/fork_test.c} \end{minipage} \normalsize - \caption{Esempio di codice per la creazione di nuovi processi.} + \caption{Esempio di codice per la creazione di nuovi processi (da + \file{fork\_test.c}).} \label{fig:proc_fork_code} \end{figure} @@ -384,7 +385,7 @@ specificato da linea di comando, e prende anche alcune opzioni per indicare degli eventuali tempi di attesa in secondi (eseguiti tramite la funzione \func{sleep}) per il padre ed il figlio (con \cmd{forktest -h} si ottiene la descrizione delle opzioni). Il codice completo, compresa la parte che gestisce -le opzioni a riga di comando, è disponibile nel file \file{ForkTest.c}, +le opzioni a riga di comando, è disponibile nel file \file{fork\_test.c}, distribuito insieme agli altri sorgenti degli esempi su \url{http://gapil.truelite.it/gapil_source.tgz}. @@ -613,8 +614,8 @@ comune dopo l'esecuzione di una \func{fork} è la seguente: \item gli identificatori per il controllo di sessione: il \itindex{process~group} \textit{process group-ID} e il \textit{session id} ed il terminale di controllo (vedi 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 \index{directory~di~lavoro} 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 dei file (vedi sez.~\ref{sec:file_perm_management}); \item la maschera dei segnali bloccati (vedi sez.~\ref{sec:sig_sigmask}) e le @@ -667,7 +668,7 @@ una \func{fork} invece sono:\footnote{a parte le ultime quattro, relative a \end{itemize*} Una seconda funzione storica usata per la creazione di un nuovo processo è -\func{vfork}, che è esattamente identica a \func{fork} ed ha la stessa +\funcm{vfork}, che è esattamente identica a \func{fork} ed ha la stessa semantica e gli stessi errori; la sola differenza è che non viene creata la tabella delle pagine né la struttura dei task per il nuovo processo. Il processo padre è posto in attesa fintanto che il figlio non ha eseguito una @@ -699,7 +700,7 @@ di vista di come il sistema gestisce la conclusione dei processi. Abbiamo visto in sez.~\ref{sec:proc_conclusion} le tre modalità con cui un programma viene terminato in maniera normale: la chiamata di \func{exit}, che esegue le funzioni registrate per l'uscita e chiude gli \textit{stream} e poi -esegue \func{\_exit}, il ritorno dalla funzione \func{main} equivalente alla +esegue \func{\_exit}, il ritorno dalla funzione \code{main} equivalente alla chiamata di \func{exit}, e la chiamata diretta a \func{\_exit}, che passa direttamente alle operazioni di terminazione del processo da parte del kernel. @@ -745,7 +746,7 @@ Nel caso di conclusione normale, abbiamo visto in sez.~\ref{sec:proc_conclusion} che lo stato di uscita del processo viene caratterizzato tramite il valore del cosiddetto \textit{exit status}, cioè il valore passato come argomento alle funzioni \func{exit} o \func{\_exit} o il -valore di ritorno per \func{main}. Ma se il processo viene concluso in +valore di ritorno per \code{main}. Ma se il processo viene concluso in maniera anomala il programma non può specificare nessun \textit{exit status}, ed è il kernel che deve generare autonomamente il \textit{termination status} per indicare le ragioni della conclusione anomala. @@ -1145,7 +1146,7 @@ anomala), uno per indicare se è stato generato un \itindex{core~dump} significativi dello stato di uscita del processo (passato attraverso \func{\_exit}, \func{exit} o come valore - di ritorno di \func{main}); può essere + di ritorno di \code{main}); può essere valutata solo se \val{WIFEXITED} ha restituito un valore non nullo.\\ \macro{WIFSIGNALED}\texttt{(s)} & Condizione vera se il processo figlio è @@ -1196,7 +1197,7 @@ da \func{wait} o \func{waitpid}. Si tenga conto che nel caso di conclusione anomala il valore restituito da \val{WTERMSIG} può essere confrontato con le costanti che identificano i -segnali definite in \file{signal.h} ed elencate in +segnali definite in \headfile{signal.h} ed elencate in tab.~\ref{tab:sig_signal_list}, e stampato usando le apposite funzioni trattate in sez.~\ref{sec:sig_strsignal}. @@ -1347,7 +1348,7 @@ La funzione \func{wait4} è identica \func{waitpid} sia nel comportamento che per i valori dei primi tre argomenti, ma in più restituisce nell'argomento aggiuntivo \param{rusage} un sommario delle risorse usate dal processo. Questo argomento è una struttura di tipo \struct{rusage} definita in -\file{sys/resource.h}, che viene utilizzata anche dalla funzione +\headfile{sys/resource.h}, che viene utilizzata anche dalla funzione \func{getrusage} per ottenere le risorse di sistema usate da un processo. La sua definizione è riportata in fig.~\ref{fig:sys_rusage_struct} e ne tratteremo in dettaglio il significato sez.~\ref{sec:sys_resource_use}. La @@ -1391,7 +1392,7 @@ prototipo è: \item[\errcode{EACCES}] il file o l'interprete non file ordinari, o non sono eseguibili, o il file è su un filesystem montato con l'opzione \cmd{noexec}, o manca il permesso di attraversamento di una delle - directory del pathname. + directory del \textit{pathname}. \item[\errcode{EINVAL}] l'eseguibile ELF ha più di un segmento \const{PF\_INTERP}, cioè chiede di essere eseguito da più di un interprete. @@ -1414,11 +1415,11 @@ prototipo è: \end{funcproto} La funzione \func{execve} esegue il programma o lo script indicato dal -pathname \param{filename}, passandogli la lista di argomenti indicata +\textit{pathname} \param{filename}, passandogli la lista di argomenti indicata da \param{argv} e come ambiente la lista di stringhe indicata da \param{envp}. Entrambe le liste devono essere terminate da un puntatore nullo. I vettori degli argomenti e dell'ambiente possono essere acceduti dal -nuovo programma quando la sua funzione \func{main} è dichiarata nella forma +nuovo programma quando la sua funzione \code{main} è dichiarata nella forma \code{main(int argc, char *argv[], char *envp[])}. Si tenga presente per il passaggio degli argomenti e dell'ambiente esistono comunque dei limiti, su cui torneremo in sez.~\ref{sec:sys_res_limits}). @@ -1486,7 +1487,7 @@ illustrata in fig.~\ref{fig:proc_exec_relat}. La prima differenza fra le funzioni riguarda le modalità di passaggio dei valori che poi andranno a costituire gli argomenti a linea di comando (cioè i -valori di \param{argv} e \param{argc} visti dalla funzione \func{main} del +valori di \param{argv} e \param{argc} visti dalla funzione \code{main} del programma chiamato). Queste modalità sono due e sono riassunte dagli mnemonici ``\texttt{v}'' e ``\texttt{l}'' che stanno rispettivamente per \textit{vector} e \textit{list}. @@ -1513,15 +1514,15 @@ si indicano le due funzioni che replicano il comportamento della shell nello specificare il comando da eseguire; quando l'argomento \param{file} non contiene una ``\texttt{/}'' esso viene considerato come un nome di programma, e viene eseguita automaticamente una ricerca fra i file presenti nella lista -di directory specificate dalla variabile di ambiente \var{PATH}. Il file che -viene posto in esecuzione è il primo che viene trovato. Se si ha un errore +di directory specificate dalla variabile di ambiente \envvar{PATH}. Il file +che viene posto in esecuzione è il primo che viene trovato. Se si ha un errore relativo a permessi di accesso insufficienti (cioè l'esecuzione della sottostante \func{execve} ritorna un \errcode{EACCES}), la ricerca viene -proseguita nelle eventuali ulteriori directory indicate in \var{PATH}; solo se -non viene trovato nessun altro file viene finalmente restituito +proseguita nelle eventuali ulteriori directory indicate in \envvar{PATH}; solo +se non viene trovato nessun altro file viene finalmente restituito \errcode{EACCES}. Le altre quattro funzioni si limitano invece a cercare di eseguire il file indicato dall'argomento \param{path}, che viene interpretato -come il \itindex{pathname} \textit{pathname} del programma. +come il \textit{pathname} del programma. La terza differenza è come viene passata la lista delle variabili di ambiente. Con lo mnemonico ``\texttt{e}'' vengono indicate quelle funzioni che @@ -1540,8 +1541,8 @@ seguente: (\ids{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}); -\item la directory radice e la directory di lavoro corrente (vedi - sez.~\ref{sec:file_work_dir}); +\item la directory radice e la \index{directory~di~lavoro} directory di lavoro + corrente (vedi sez.~\ref{sec:file_work_dir}); \item la maschera di creazione dei file \itindex{umask} (\textit{umask}, vedi sez.~\ref{sec:file_perm_management}) ed i \textit{lock} sui file (vedi sez.~\ref{sec:file_locking}); @@ -2210,7 +2211,7 @@ chiamata con un vettore di dimensioni adeguate. Infine per impostare i gruppi supplementari di un processo ci sono due funzioni, che possono essere usate solo se si hanno i privilegi di -amministratore.\footnote{e più precisamente se si ha la \itindex{capability} +amministratore.\footnote{e più precisamente se si ha la \itindex{capabilities} \textit{capability} \macro{CAP\_SETGID}.} La prima delle due è \funcd{setgroups},\footnote{la funzione è definita in BSD e SRv4, ma a differenza di \func{getgroups} non è stata inclusa in POSIX.1-2001, per @@ -2550,7 +2551,7 @@ La funzione permette, a seconda di quanto specificato nell'argomento \param{which}, di leggere il valore di \textit{nice} di un processo, di un gruppo di processi (vedi sez.~\ref{sec:sess_proc_group}) o di un utente indicato dall'argomento \param{who}. Nelle vecchie versioni può -essere necessario includere anche \code{sys/time.h}, questo non è più +essere necessario includere anche \headfile{sys/time.h}, questo non è più necessario con versioni recenti delle librerie, ma è comunque utile per portabilità. @@ -2933,7 +2934,7 @@ politica ordinaria essa ha senso soltanto per quelli \textit{real-time}, dato che per i primi la priorità statica può essere soltanto nulla. La disponibilità di entrambe le funzioni può essere verificata controllando la macro \macro{\_POSIX\_PRIORITY\_SCHEDULING} che è definita nell'\textit{header - file} \file{sched.h}. + file} \headfile{sched.h}. Se invece si vuole sapere quale è politica di \textit{scheduling} di un processo si può usare la funzione \funcd{sched\_getscheduler}, il cui @@ -3129,7 +3130,7 @@ forma attuale.\footnote{pertanto se la vostra pagina di manuale non è aggiornata, o usate quella particolare versione delle \acr{glibc}, potrete trovare indicazioni diverse, il prototipo illustrato è quello riportato nella versione corrente (maggio 2008) delle pagine di manuale e - corrispondente alla definizione presente in \file{sched.h}.} + corrispondente alla definizione presente in \headfile{sched.h}.} La funzione imposta, con l'uso del valore contenuto all'indirizzo \param{mask}, l'insieme dei processori sui quali deve essere eseguito il @@ -3215,7 +3216,7 @@ Si tenga presente che trattandosi di macro l'argomento \param{cpu} può essere valutato più volte. Questo significa ad esempio che non si può usare al suo posto una funzione o un'altra macro, altrimenti queste verrebbero eseguite più volte, l'argomento cioè non deve avere \textsl{effetti collaterali} (in gergo -\itindex{side!effects} \textit{side effects}).\footnote{nel linguaggio C si +\itindex{side~effects} \textit{side effects}).\footnote{nel linguaggio C si parla appunto di \textit{side effects} quando si usano istruzioni la cui valutazione comporta effetti al di fuori dell'istruzione stessa, come il caso indicato in cui si passa una funzione ad una macro che usa l'argomento @@ -3757,8 +3758,8 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. impostato ad 1. Una volta abilitato il \itindex{secure~computing~mode} \textit{secure computing mode} il processo potrà utilizzare soltanto un insieme estremamente limitato di \textit{system call}: \func{read}, - \func{write}, \func{\_exit} e \func{sigreturn}. Ogni altra \textit{system - call} porterà all'emissione di un \func{SIGKILL} (vedi + \func{write}, \func{\_exit} e \funcm{sigreturn}. Ogni altra \textit{system + call} porterà all'emissione di un \signal{SIGKILL} (vedi sez.~\ref{sec:sig_termination}). Il \textit{secure computing mode} è stato ideato per fornire un supporto per l'esecuzione di codice esterno non fidato e non verificabile a scopo di calcolo;\footnote{lo scopo è quello di poter @@ -3775,7 +3776,7 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC. funzione è totalmente inutile in quanto l'unico valore ottenibile è 0, dato che la chiamata di questa funzione in \itindex{secure~computing~mode} \textit{secure computing mode} comporterebbe l'emissione di - \texttt{SIGKILL}, è stata comunque definita per eventuali estensioni future. + \signal{SIGKILL}, è stata comunque definita per eventuali estensioni future. Introdotta a partire dal kernel 2.6.23. \item[\const{PR\_SET\_SECUREBITS}] Imposta i \itindex{securebits} @@ -3900,9 +3901,9 @@ processi, che poi è stata utilizzata anche per fornire supporto per le tecnologie di virtualizzazione dei processi (i cosiddetti \textit{container}). Per questo l'interfaccia per la creazione di un nuovo processo è stata -delegata ad una nuova \textit{system call}, \func{sys\_clone}, che consente di -reimplementare anche la tradizionale \func{fork}. In realtà in questo caso più -che di nuovi processi si può parlare della creazioni di nuovi +delegata ad una nuova \textit{system call}, \funcm{sys\_clone}, che consente +di reimplementare anche la tradizionale \func{fork}. In realtà in questo caso +più che di nuovi processi si può parlare della creazioni di nuovi ``\textit{task}'' del kernel che possono assumere la veste sia di un processo classico isolato dagli altri come quelli trattati finora, che di un \textit{thread} in cui la memoria viene condivisa fra il processo chiamante ed @@ -4061,6 +4062,9 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa \end{basedescript} +%TODO trattare unshare + + \subsection{La funzione \func{ptrace}} \label{sec:process_ptrace} @@ -4290,7 +4294,7 @@ aggiungendo il suffisso \code{\_r} al nome della versione normale. % LocalWords: nell'header scheduler system interrupt timer HZ asm Hertz clock % LocalWords: l'alpha tick fork wait waitpid exit exec image glibc int pgid ps % LocalWords: sid thread Ingo Molnar ppid getpid getppid sys unistd LD threads -% LocalWords: void ForkTest tempnam pathname sibling cap errno EAGAIN ENOMEM +% LocalWords: void tempnam pathname sibling cap errno EAGAIN ENOMEM % LocalWords: stack read only copy write tab client spawn forktest sleep PATH % LocalWords: source LIBRARY scheduling race condition printf descriptor dup % LocalWords: close group session tms lock vfork execve BSD stream main abort