X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=prochand.tex;h=7505cadf8b33df6eaf307c521f5194850ff19346;hp=f17fec4cdfd073dd99e61880f9ed80954f3cc6c7;hb=ff2d0141751ed62ef56e5bfd226c589311b8b669;hpb=46029a05c9009df38022e82b0f20732290388ef1 diff --git a/prochand.tex b/prochand.tex index f17fec4..7505cad 100644 --- a/prochand.tex +++ b/prochand.tex @@ -127,11 +127,11 @@ processi. Il kernel mantiene una tabella dei processi attivi, la cosiddetta \textit{process table}; per ciascun processo viene mantenuta una voce nella -tabella dei processi costituita da una struttura \type{task\_struct}, che +tabella dei processi costituita da una struttura \struct{task\_struct}, che contiene tutte le informazioni rilevanti per quel processo. Tutte le strutture usate a questo scopo sono dichiarate nell'header file \file{linux/sched.h}, ed uno schema semplificato, che riporta la struttura delle principali informazioni -contenute nella \type{task\_struct} (che in seguito incontreremo a più +contenute nella \struct{task\_struct} (che in seguito incontreremo a più riprese), è mostrato in \figref{fig:proc_task_struct}. \begin{figure}[htb] @@ -247,11 +247,18 @@ sempre il \acr{pid} uguale a uno. Tutti i processi inoltre memorizzano anche il \acr{pid} del genitore da cui sono stati creati, questo viene chiamato in genere \acr{ppid} (da \textit{parent process id}). Questi due identificativi possono essere -ottenuti da programma usando le funzioni: +ottenuti usando le due funzioni \funcd{getpid} e \funcd{getppid}, i cui +prototipi sono: \begin{functions} - \headdecl{sys/types.h} \headdecl{unistd.h} \funcdecl{pid\_t getpid(void)} - Restituisce il \acr{pid} del processo corrente. \funcdecl{pid\_t - getppid(void)} Restituisce il \acr{pid} del padre del processo corrente. + \headdecl{sys/types.h} + \headdecl{unistd.h} + \funcdecl{pid\_t getpid(void)} + + Restituisce il \acr{pid} del processo corrente. + + \funcdecl{pid\_t getppid(void)} + + Restituisce il \acr{pid} del padre del processo corrente. \bodydesc{Entrambe le funzioni non riportano condizioni di errore.} \end{functions} @@ -285,7 +292,7 @@ affrontato in dettaglio in \secref{sec:proc_perms}. \subsection{La funzione \func{fork}} \label{sec:proc_fork} -La funzione \func{fork} è la funzione fondamentale della gestione dei +La funzione \funcd{fork} è la funzione fondamentale della gestione dei processi: come si è detto l'unico modo di creare un nuovo processo è attraverso l'uso di questa funzione, essa quindi riveste un ruolo centrale tutte le volte che si devono scrivere programmi che usano il multitasking. Il @@ -644,7 +651,7 @@ le differenze fra padre e figlio dopo la \func{fork} invece sono: \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. -\item i valori dei tempi di esecuzione della struttura \var{tms} (vedi +\item i valori dei tempi di esecuzione della struttura \struct{tms} (vedi \secref{sec:sys_cpu_times}) che nel figlio sono posti a zero. \item i \textit{lock} sui file (vedi \secref{sec:file_locking}), che non vengono ereditati dal figlio. @@ -672,7 +679,7 @@ venne introdotta in BSD per migliorare le prestazioni. Dato che Linux supporta il \textit{copy on write}\index{copy on write} la perdita di prestazioni è assolutamente trascurabile, e l'uso di questa -funzione (che resta un caso speciale della funzione \func{clone}), è +funzione (che resta un caso speciale della system call \func{\_\_clone}), è deprecato; per questo eviteremo di trattarla ulteriormente. @@ -856,7 +863,7 @@ principale attende le richieste che vengono poi soddisfatte da una serie di processi figli. Si è già sottolineato al paragrafo precedente come in questo caso diventi necessario gestire esplicitamente la conclusione dei figli onde evitare di riempire di \textit{zombie}\index{zombie} la tabella dei processi; -le funzioni deputate a questo compito sono sostanzialmente due, \func{wait} e +le funzioni deputate a questo compito sono sostanzialmente due, \funcd{wait} e \func{waitpid}. La prima, il cui prototipo è: \begin{functions} \headdecl{sys/types.h} @@ -879,10 +886,10 @@ immediatamente, se pi più volte se si vuole recuperare lo stato di terminazione di tutti quanti. Al ritorno della funzione lo stato di terminazione del figlio viene salvato -nella variabile puntata da \var{status} e tutte le risorse del kernel relative -al processo (vedi \secref{sec:proc_termination}) vengono rilasciate. Nel caso -un processo abbia più figli il valore di ritorno (il \acr{pid} del figlio) -permette di identificare qual'è quello che è uscito. +nella variabile puntata da \param{status} e tutte le risorse del kernel +relative al processo (vedi \secref{sec:proc_termination}) vengono rilasciate. +Nel caso un processo abbia più figli il valore di ritorno (il \acr{pid} del +figlio) permette di identificare qual'è quello che è uscito. Questa funzione ha il difetto di essere poco flessibile, in quanto ritorna all'uscita di un qualunque processo figlio. Nelle occasioni in cui è @@ -891,9 +898,9 @@ predisporre un meccanismo che tenga conto dei processi gi provvedere a ripetere la chiamata alla funzione nel caso il processo cercato sia ancora attivo. -Per questo motivo lo standard POSIX.1 ha introdotto la funzione \func{waitpid} -che effettua lo stesso servizio, ma dispone di una serie di funzionalità più -ampie, legate anche al controllo di sessione (si veda +Per questo motivo lo standard POSIX.1 ha introdotto la funzione +\funcd{waitpid} che effettua lo stesso servizio, ma dispone di una serie di +funzionalità più ampie, legate anche al controllo di sessione (si veda \secref{sec:sess_job_control}). Dato che è possibile ottenere lo stesso comportamento di \func{wait} si consiglia di utilizzare sempre questa funzione, il cui prototipo è: @@ -931,16 +938,16 @@ secondo lo specchietto riportato in \tabref{tab:proc_waidpid_pid}. \hline $<-1$& -- & attende per un figlio il cui \textit{process group} (vedi \secref{sec:sess_proc_group}) è uguale al - valore assoluto di \var{pid}. \\ + valore assoluto di \param{pid}. \\ $-1$ & \const{WAIT\_ANY} & attende per un figlio qualsiasi, usata in questa maniera è equivalente a \func{wait}.\\ $0$ & \const{WAIT\_MYPGRP} & attende per un figlio il cui \textit{process group} è uguale a quello del processo chiamante. \\ $>0$ & -- &attende per un figlio il cui \acr{pid} è uguale al - valore di \var{pid}.\\ + valore di \param{pid}.\\ \hline \end{tabular} - \caption{Significato dei valori del parametro \var{pid} della funzione + \caption{Significato dei valori dell'argomento \param{pid} della funzione \func{waitpid}.} \label{tab:proc_waidpid_pid} \end{table} @@ -1032,7 +1039,7 @@ Lo standard POSIX.1 definisce una serie di macro di preprocessore da usare per analizzare lo stato di uscita. Esse sono definite sempre in \file{} ed elencate in \tabref{tab:proc_status_macro} (si tenga presente che queste macro prendono come parametro la variabile di tipo -\ctyp{int} puntata da \var{status}). +\ctyp{int} puntata da \param{status}). Si tenga conto che nel caso di conclusione anomala il valore restituito da \val{WTERMSIG} può essere confrontato con le costanti definite in @@ -1065,7 +1072,7 @@ queste funzioni, che diventano accessibili definendo la costante ormai deprecata in favore di \func{wait4}. \end{functions} \noindent -la struttura \type{rusage} è definita in \file{sys/resource.h}, e viene +la struttura \struct{rusage} è definita in \file{sys/resource.h}, e viene utilizzata anche dalla funzione \func{getrusage} (vedi \secref{sec:sys_resource_use}) per ottenere le risorse di sistema usate da un processo; la sua definizione è riportata in \figref{fig:sys_rusage_struct}. @@ -1117,8 +1124,8 @@ famiglia di funzioni) che possono essere usate per questo compito, in realt \end{prototype} La funzione \func{exec} esegue il file o lo script indicato da -\var{filename}, passandogli la lista di argomenti indicata da \var{argv} -e come ambiente la lista di stringhe indicata da \var{envp}; entrambe le +\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 @@ -1149,7 +1156,7 @@ Per capire meglio le differenze fra le funzioni della famiglia si pu riferimento allo specchietto riportato in \tabref{tab:proc_exec_scheme}. La prima differenza riguarda le modalità di passaggio dei parametri che poi andranno a costituire gli argomenti a linea di comando (cioè i valori di -\var{argv} e \var{argc} visti dalla funzione \func{main} del programma +\param{argv} e \param{argc} visti dalla funzione \func{main} del programma chiamato). Queste modalità sono due e sono riassunte dagli mnemonici \code{v} e \code{l} @@ -1197,7 +1204,7 @@ per indicare il nome del file che contiene il programma che verr La seconda differenza fra le funzioni riguarda le modalità con cui si specifica il programma che si vuole eseguire. Con lo mnemonico \code{p} si indicano le due funzioni che replicano il comportamento della shell nello -specificare il comando da eseguire; quando il parametro \var{file} non +specificare il comando da eseguire; quando il parametro \param{file} non contiene una \file{/} 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 @@ -1209,7 +1216,7 @@ 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 dal parametro \var{path}, che viene interpretato come il +indicato dall'argomento \param{path}, che viene interpretato come il \textit{pathname} del programma. \begin{figure}[htb] @@ -1507,7 +1514,7 @@ eventuali \textsl{groupid supplementari} non vengono modificati. L'effetto della chiamata è diverso a seconda dei privilegi del processo; se l'\textsl{userid effettivo} è zero (cioè è quello dell'amministratore di sistema) allora tutti gli identificatori (\textit{real}, \textit{effective} e -\textit{saved}) vengono impostati al valore specificato da \var{uid}, +\textit{saved}) vengono impostati al valore specificato da \param{uid}, altrimenti viene impostato solo l'\textsl{userid effettivo}, e soltanto se il valore specificato corrisponde o all'\textsl{userid reale} o all'\textsl{userid salvato}. Negli altri casi viene segnalato un errore (con @@ -1589,11 +1596,11 @@ loro \textit{effective} e \textit{real}. I loro prototipi sono: \funcdecl{int setreuid(uid\_t ruid, uid\_t euid)} Imposta l'\textsl{userid reale} e l'\textsl{userid effettivo} del processo corrente ai valori -specificati da \var{ruid} e \var{euid}. +specificati da \param{ruid} e \param{euid}. \funcdecl{int setregid(gid\_t rgid, gid\_t egid)} Imposta il \textsl{groupid reale} ed il \textsl{groupid effettivo} del processo corrente ai valori -specificati da \var{rgid} e \var{egid}. +specificati da \param{rgid} e \param{egid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: l'unico errore possibile è \errval{EPERM}.} @@ -1642,10 +1649,10 @@ identificatori del gruppo \textit{effective}; i loro prototipi sono: \headdecl{sys/types.h} \funcdecl{int seteuid(uid\_t uid)} Imposta l'userid effettivo del processo -corrente a \var{uid}. +corrente a \param{uid}. \funcdecl{int setegid(gid\_t gid)} Imposta il groupid effettivo del processo -corrente a \var{gid}. +corrente a \param{gid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: l'unico errore è \errval{EPERM}.} @@ -1670,13 +1677,14 @@ e permettono un completo controllo su tutti gli identificatori (\textit{real}, \headdecl{sys/types.h} \funcdecl{int setresuid(uid\_t ruid, uid\_t euid, uid\_t suid)} Imposta -l'userid reale, l'userid effettivo e l'userid salvato del processo corrente -ai valori specificati rispettivamente da \var{ruid}, \var{euid} e \var{suid}. +l'userid reale, l'userid effettivo e l'userid salvato del processo corrente ai +valori specificati rispettivamente da \param{ruid}, \param{euid} e +\param{suid}. \funcdecl{int setresgid(gid\_t rgid, gid\_t egid, gid\_t sgid)} Imposta il groupid reale, il groupid effettivo ed il groupid salvato del processo -corrente ai valori specificati rispettivamente da \var{rgid}, \var{egid} e -\var{sgid}. +corrente ai valori specificati rispettivamente da \param{rgid}, \param{egid} e +\param{sgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: l'unico errore è \errval{EPERM}.} @@ -1745,10 +1753,10 @@ usate se si intendono scrivere programmi portabili; i loro prototipi sono: \headdecl{sys/fsuid.h} \funcdecl{int setfsuid(uid\_t fsuid)} Imposta l'userid di filesystem del -processo corrente a \var{fsuid}. +processo corrente a \param{fsuid}. \funcdecl{int setfsgid(gid\_t fsgid)} Imposta il groupid di filesystem del -processo corrente a \var{fsgid}. +processo corrente a \param{fsgid}. \bodydesc{Le funzioni restituiscono 0 in caso di successo e -1 in caso di fallimento: l'unico errore possibile è \errval{EPERM}.} @@ -2006,10 +2014,10 @@ assegnata una \textit{time-slice}, cio una fetta) per il quale esso deve essere eseguito. Il valore della \textit{time-slice} è controllato dalla cosiddetta \textit{nice} (o \textit{niceness}) del processo. Essa è contenuta nel campo \var{nice} di -\var{task\_struct}; tutti i processi vengono creati con lo stesso valore, ed -essa specifica il valore della durata iniziale della \textit{time-slice} che -viene assegnato ad un altro campo della struttura (\var{counter}) quando il -processo viene eseguito per la prima volta e diminuito progressivamente ad +\struct{task\_struct}; tutti i processi vengono creati con lo stesso valore, +ed essa specifica il valore della durata iniziale della \textit{time-slice} +che viene assegnato ad un altro campo della struttura (\var{counter}) quando +il processo viene eseguito per la prima volta e diminuito progressivamente ad ogni interruzione del timer. Quando lo scheduler\index{scheduler} viene eseguito scandisce la coda dei @@ -2189,13 +2197,13 @@ prototipo \begin{prototype}{sched.h} {int sched\_setscheduler(pid\_t pid, int policy, const struct sched\_param *p)} Imposta priorità e politica di scheduling per il processo \param{pid}. - - \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} può assumere i valori: + + \bodydesc{La funzione ritorna la priorità in caso di successo e -1 in caso + di errore, nel qual caso \var{errno} può assumere i valori: \begin{errlist} \item[\errcode{ESRCH}] il processo \param{pid} non esiste. - \item[\errcode{EINVAL}] il valore di \param{policy} non esiste o il relativo - valore di \param{p} non è valido. + \item[\errcode{EINVAL}] il valore di \param{policy} non esiste o il + relativo valore di \param{p} non è valido. \item[\errcode{EPERM}] il processo non ha i privilegi per attivare la politica richiesta (vale solo per \const{SCHED\_FIFO} e \const{SCHED\_RR}). @@ -2229,12 +2237,12 @@ la politica di scheduling corrente. \label{tab:proc_sched_policy} \end{table} -Il valore della priorità è passato attraverso la struttura \var{sched\_param} -(riportata in \figref{fig:sig_sched_param}), il cui solo campo attualmente -definito è \var{sched\_priority}, che nel caso delle priorità assolute deve -essere specificato nell'intervallo fra un valore massimo ed uno minimo, che -nel caso sono rispettivamente 1 e 99 (il valore zero è legale, ma indica i -processi normali). +Il valore della priorità è passato attraverso la struttura +\struct{sched\_param} (riportata in \figref{fig:sig_sched_param}), il cui solo +campo attualmente definito è \var{sched\_priority}, che nel caso delle +priorità assolute deve essere specificato nell'intervallo fra un valore +massimo ed uno minimo, che nel caso sono rispettivamente 1 e 99 (il valore +zero è legale, ma indica i processi normali). \begin{figure}[!htb] \footnotesize \centering @@ -2246,7 +2254,7 @@ struct sched_param { \end{lstlisting} \end{minipage} \normalsize - \caption{La struttura \var{sched\_param}.} + \caption{La struttura \structd{sched\_param}.} \label{fig:sig_sched_param} \end{figure} @@ -2355,7 +2363,7 @@ il suo prototipo \end{prototype} La funzione restituisce il valore dell'intervallo di tempo usato per la -politica \textit{round robin} in una struttura \var{timespec}, (la cui +politica \textit{round robin} in una struttura \struct{timespec}, (la cui definizione si può trovare in \figref{fig:sys_timeval_struct}).