Grandi pulizie di primavera... dimmi te se uno deve sprecare le ferie cosi`
[gapil.git] / process.tex
index 09e67032993948e4907a973ea79df3e9ceb82f9d..c1fc583863e811e50ac271fe79d68ce145338e32 100644 (file)
@@ -7,6 +7,14 @@ viene posto in esecuzione, viene fatto partire un processo che si incarica di
 eseguirne il codice. In sostanza i processi costituiscono l'unità base per
 l'allocazione e l'uso delle risorse del sistema.
 
 eseguirne il codice. In sostanza i processi costituiscono l'unità base per
 l'allocazione e l'uso delle risorse del sistema.
 
+In questo capitolo affronteremo i dettagli della creazione e della distruzione
+dei processi, della gestione dei loro attributi e privilegi, e di tutte le
+funzioni a questo connesse.
+
+
+\section{Una panoramica sui concetti base}
+\label{sec:proc_gen}
+
 Una delle caratteristiche essenziali di unix (che esamineremo in dettaglio più
 avanti) è che ogni processo può a sua volta generare altri processi figli
 (\textit{child}): questo è ad esempio quello che fa la shell quando mette in
 Una delle caratteristiche essenziali di unix (che esamineremo in dettaglio più
 avanti) è che ogni processo può a sua volta generare altri processi figli
 (\textit{child}): questo è ad esempio quello che fa la shell quando mette in
@@ -23,8 +31,8 @@ gerarchicamente dalla relazione fra genitori e figli; alla base dell'albero in
 questo caso c'è init che è progenitore di ogni altro processo.
 
 
 questo caso c'è init che è progenitore di ogni altro processo.
 
 
-\section{Una panoramica sui concetti base}
-\label{sec:proc_gen}
+\section{Gli identificatori dei processi}
+\label{sec:proc_id}
 
 Ogni processo viene identificato dal sistema da un numero identificativo
 unico, il \textit{process id} o \textit{pid}. Questo viene assegnato in forma
 
 Ogni processo viene identificato dal sistema da un numero identificativo
 unico, il \textit{process id} o \textit{pid}. Questo viene assegnato in forma
@@ -34,25 +42,43 @@ arriva a 32767) oltre il quale si riparte dal numero pi
 (FIXME: verificare, non sono sicuro).  Per questo motivo processo il processo
 di avvio (init) ha sempre il pid uguale a uno.
 
 (FIXME: verificare, non sono sicuro).  Per questo motivo processo il processo
 di avvio (init) ha sempre il pid uguale a uno.
 
-Quando un processo ha concluso il suo compito o ha incontrato un errore non
-risolvibile esso può essere terminato con la funzione \texttt{exit} (la
-questione è più complessa ma ci torneremo più avanti). La vita del processo
-però termina solo quando viene chiamata la quando la sua conclusione viene
-ricevuta dal processo padre, a quel punto tutte le risorse allocate nel
-sistema ad esso associate vengono rilasciate.
+Ogni processo è identificato univocamente dal sistema per il suo
+pid; quest'ultimo è un apposito tipo di dato, il \texttt{pid\_t} che in
+genere è un intero con segno (nel caso di Linux e delle glibc il tipo usato è
+\texttt{int}.
+
+Tutti i processi inoltre portano traccia del pid del genitore, chiamato in
+genere \textit{ppid} (da \textit{Parente Process Id}). Questi identificativi
+possono essere ottenuti da un programma usando le funzioni:
+\begin{itemize} 
+  \item \texttt{pid\_t getpid(void)} restituisce il pid del processo corrente.
+    
+  \item \texttt{pid\_t getppid(void)} restituisce il pid del padre del processo
+    corrente.
+
+\end{itemize}
+(per l'accesso a queste funzioni e ai relativi tipi di dati occorre includere
+gli header files \texttt{unistd.h} e \texttt{sys/types.h}). 
+
+
+
+\section{Il controllo dei processi}
+\label{sec:proc_control}
+
+Esamineremo in questa sezione le varie funzioni per il controllo dei processi:
+la lore creazione, la terminazione, l'esecuzione di altri programmi. Prima di
+trattare in dettaglio le singole funzioni, faremo un'introduzione generale ai
+contetti che stanno alla base della gestione dei processi in unix.
+
+\subsection{Una panoramica}
+\label{sec:proc_control_overview}
 
 I processi vengono creati dalla funzione \texttt{fork}; in genere questa è una
 
 I processi vengono creati dalla funzione \texttt{fork}; in genere questa è una
-system call, Linux però usa un'altra nomenclatura, e la funzione fork è basata
-a sua volta sulla system call \texttt{clone}, che viene usata anche per
+system call, ma linux però usa un'altra nomenclatura, e la funzione fork è
+basata a sua volta sulla system call \texttt{clone}, che viene usata anche per
 generare i \textit{thread}.  Il processo figlio creato dalla \textit{fork} è
 generare i \textit{thread}.  Il processo figlio creato dalla \textit{fork} è
-una copia identica del processo processo padre, solo che ha un suo pid proprio.
-
-Dopo l'esecuzione di una fork sia il processo padre che il processo figlio
-continuano ad essere eseguiti normalmente, ed il processo figlio esegue
-esattamente lo stesso codice del padre. La sola differenza è che nel processo
-padre il valore di ritorno della funzione fork è il pid del processo figlio,
-mentre nel figlio è zero; in questo modo il programma può identificare se
-viene eseguito dal padre o dal figlio. 
+una copia identica del processo processo padre, solo che ha un suo pid
+proprio.
 
 Se si vuole che il processo padre si fermi fino alla conclusione del processo
 figlio questo deve essere specificato subito dopo la fork chiamando la
 
 Se si vuole che il processo padre si fermi fino alla conclusione del processo
 figlio questo deve essere specificato subito dopo la fork chiamando la
@@ -60,6 +86,13 @@ funzione \texttt{wait} o la funzione \texttt{waitpid}, che restituiscono anche
 una informazione abbastanza limitata (il codice di uscita) sulle cause della
 terminazione del processo.
 
 una informazione abbastanza limitata (il codice di uscita) sulle cause della
 terminazione del processo.
 
+Quando un processo ha concluso il suo compito o ha incontrato un errore non
+risolvibile esso può essere terminato con la funzione \texttt{exit} (la
+questione è più complessa ma ci torneremo più avanti). La vita del processo
+però termina solo quando viene chiamata la quando la sua conclusione viene
+ricevuta dal processo padre, a quel punto tutte le risorse allocate nel
+sistema ad esso associate vengono rilasciate.
+
 Avere due processi che eseguono esattamente lo stesso codice non è molto
 utile, mormalmente si genera un secondo processo per affidagli l'esecuzione di
 un compito specifico (ad esempio gestire una connessione dopo che questa è
 Avere due processi che eseguono esattamente lo stesso codice non è molto
 utile, mormalmente si genera un secondo processo per affidagli l'esecuzione di
 un compito specifico (ad esempio gestire una connessione dopo che questa è
@@ -68,8 +101,8 @@ questo si usa la seconda funzione fondamentale per programmazione coi processi
 che è la \texttt{exec}.
 
 Il programma che un processo sta eseguendo si chiama immagine del processo
 che è la \texttt{exec}.
 
 Il programma che un processo sta eseguendo si chiama immagine del processo
-(\textit{process image}), le funzioni della famiglia \textit{exec} permette di
-caricare un'altro programma da disco sostituendo quest'ultimo alla process
+(\textit{process image}), le funzioni della famiglia \textit{exec} permettono
+di caricare un'altro programma da disco sostituendo quest'ultimo alla process
 image corrente, questo fa si che la precedente immagine venga completamente
 cancellata e quando il nuovo programma esce anche il processo termina, senza
 ritornare alla precedente immagine.
 image corrente, questo fa si che la precedente immagine venga completamente
 cancellata e quando il nuovo programma esce anche il processo termina, senza
 ritornare alla precedente immagine.
@@ -77,38 +110,41 @@ ritornare alla precedente immagine.
 Per questo motivo la \texttt{fork} e la \texttt{exec} sono funzioni molto
 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
 Per questo motivo la \texttt{fork} e la \texttt{exec} sono funzioni molto
 particolari con caratteristiche uniche rispetto a tutte le altre, infatti la
 prima ritorna due volte (nel processo padre e nel figlio) mentre la seconda
-non ritorna mai (in quanto viene eseguito un altro programma).
+non ritorna mai (in quanto con essa viene eseguito un altro programma).
 
 
 
 
-\section{Identificazione}
-\label{sec:proc_id}
+\subsection{La funzione \texttt{fork}}
+\label{sec:proc_fork}
 
 
-Come detto ogni processo è identificato univocamente dal sistema per il suo
-pid; quest'ultimo è un apposito tipo di dato, il \texttt{pid\_t} che in
-genere è un intero con segno (nel caso di Linux e delle glibc il tipo usato è
-\texttt{int}.
 
 
-Tutti i processi inoltre portano traccia del pid del genitore, chiamato in
-genere \textit{ppid} (da \textit{Parente Process Id}). Questi identificativi
-possono essere ottenuti da un programma usando le funzioni:
-\begin{itemize} 
-  \item \texttt{pid\_t getpid(void)} restituisce il pid del processo corrente.
-    
-  \item \texttt{pid\_t getppid(void)} restituisce il pid del padre del processo
-    corrente.
+Dopo l'esecuzione di una fork sia il processo padre che il processo figlio
+continuano ad essere eseguiti normalmente, ed il processo figlio esegue
+esattamente lo stesso codice del padre. La sola differenza è che nel processo
+padre il valore di ritorno della funzione fork è il pid del processo figlio,
+mentre nel figlio è zero; in questo modo il programma può identificare se
+viene eseguito dal padre o dal figlio. 
+
 
 
-\end{itemize}
-(per l'accesso a queste funzioni e ai relativi tipi di dati occorre includere
-gli header files \texttt{unistd.h} e \texttt{sys/types.h}. 
 
 
 
 
-\section{Provilegi e permessi}
+\subsection{La funzione \texttt{exit}}
+\label{sec:proc_exit}
+
+\subsection{Le funzioni \texttt{wait} e  \texttt{waitpid}}
+\label{sec:proc_wait}
+
+\subsection{Le funzioni \texttt{exec}}
+\label{sec:proc_exec}
+
+
+
+
+
+
+\section{Il controllo di accesso}
 \label{sec:process_perms}
 
 Va messo qui tutta la storia su effective, real, saved uid, e pure le cose di
 linux come il filesystem uid.
 
 
 \label{sec:process_perms}
 
 Va messo qui tutta la storia su effective, real, saved uid, e pure le cose di
 linux come il filesystem uid.
 
 
-
-\section{Creazione dei processi}
-\label{sec:proc_fork}