(che in seguito incontreremo a più riprese), è mostrato in
fig.~\ref{fig:proc_task_struct}.
-\begin{figure}[htb]
- \centering
- \includegraphics[width=14cm]{img/task_struct}
+\begin{figure}[!htb]
+ \centering \includegraphics[width=14cm]{img/task_struct}
\caption{Schema semplificato dell'architettura delle strutture usate dal
kernel nella gestione dei processi.}
\label{fig:proc_task_struct}
\func{getppid}, vedi sez.~\ref{sec:proc_pid}) per cui si usa il valore nullo,
che non è il \acr{pid} di nessun processo.
-\begin{figure}[!htb]
+\begin{figure}[!htbp]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\codesamplewidth}
\includecodesample{listati/ForkTest.c}
\end{minipage}
\normalsize
\const{WCONTINUED}& Ritorna anche quando un processo figlio che era stato
fermato ha ripreso l'esecuzione.\footnotemark \\
\hline
- \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone},
- vale a dire processi che non emettono nessun segnale
- o emettono un segnale diverso da \const{SIGCHL} alla
+ \const{\_\_WCLONE}& Attende solo per i figli creati con \func{clone}
+ (vedi sez.~\ref{sec:process_clone}), vale a dire
+ processi che non emettono nessun segnale
+ o emettono un segnale diverso da \const{SIGCHLD} alla
terminazione. \\
\const{\_\_WALL} & Attende per qualunque processo figlio. \\
\const{\_\_WNOTHREAD}& Non attende per i figli di altri \textit{thread}
indicato dall'argomento \param{path}, che viene interpretato come il
\itindex{pathname} \textit{pathname} del programma.
-\begin{figure}[htb]
- \centering
- \includegraphics[width=12cm]{img/exec_rel}
+\begin{figure}[!htb]
+ \centering \includegraphics[width=12cm]{img/exec_rel}
\caption{La interrelazione fra le sei funzioni della famiglia \func{exec}.}
\label{fig:proc_exec_relat}
\end{figure}
debba essere assegnato all'interno di un intervallo fra un massimo ed un
minimo che nel caso di Linux sono rispettivamente 1 e 99.
-\begin{figure}[!bht]
+\begin{figure}[!htbp]
\footnotesize \centering
- \begin{minipage}[c]{15cm}
+ \begin{minipage}[c]{\textwidth}
\includestruct{listati/sched_param.c}
\end{minipage}
\normalsize
utilizzo non avrà alcun effetto.} Dato che non esiste una interfaccia
diretta nelle \acr{glibc} per queste due funzioni occorrerà invocarle tramite
la funzione \func{syscall} (come illustrato in
-sez.~\ref{sec:intro_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
+sez.~\ref{sec:proc_syscall}). Le due funzioni sono \funcd{ioprio\_get} ed
\funcd{ioprio\_set}; i rispettivi prototipi sono:
\begin{functions}
\headdecl{linux/ioprio.h}
alla creazione dei \textit{thread}, le \acr{glibc} definiscono una funzione di
libreria con una sintassi diversa, orientata a questo scopo, e la
\textit{system call} resta accessibile solo se invocata esplicitamente come
-visto in sez.~\ref{sec:intro_syscall}.\footnote{ed inoltre per questa
+visto in sez.~\ref{sec:proc_syscall}.\footnote{ed inoltre per questa
\textit{system call} non è disponibile la chiamata veloce con
\texttt{vsyscall}.} La funzione di libreria si chiama semplicemente
\funcd{clone} ed il suo prototipo è:
}
\end{functions}
+La funzione prende come primo argomento il puntatore alla funzione che verrà
+messa in esecuzione nel nuovo processo, che può avere un unico argomento di
+tipo puntatore a \ctyp{void}, il cui valore viene passato dal terzo
+argomento \param{arg}; per quanto il precedente prototipo possa intimidire
+nella sua espressione, in realtà l'uso è molto semplice basterà definire una
+qualunque funzione \param{fn} del tipo indicato, e \code{fn(arg)} sarà
+eseguita in un nuovo processo.
+
+Il nuovo processo resterà in esecuzione fintanto che la funzione \param{fn}
+non ritorna, o esegue \func{exit} o viene terminata da un segnale. Il valore
+di ritorno della funzione (o quello specificato con \func{exit}) verrà
+utilizzato come stato di uscita della funzione.
+I tre argomenti \param{ptid}, \param{tls} e \param{ctid} sono opzionali e sono
+presenti solo a partire dal kernel 2.6.
+Il comportamento di \func{clone}, che si riflette sulle caratteristiche del
+nuovo processo da essa creato, è controllato dall'argomento \param{flags},
+
+\begin{basedescript}{\desclabelstyle{\pushlabel}}
+
+\item[\const{CLONE\_CHILD\_CLEARTID}]
+\item[\const{CLONE\_CHILD\_SETTID}]
+\item[\const{CLONE\_FILES}]
+\item[\const{CLONE\_FS}]
+\item[\const{CLONE\_IO}]
+\item[\const{CLONE\_NEWIPC}]
+\item[\const{CLONE\_NEWNET}]
+\item[\const{CLONE\_NEWNS}]
+\item[\const{CLONE\_NEWPID}]
+\item[\const{CLONE\_NEWUTS}]
+\item[\const{CLONE\_PARENT}]
+\item[\const{CLONE\_PARENT\_SETTID}]
+\item[\const{CLONE\_PID}]
+\item[\const{CLONE\_PTRACE}]
+\item[\const{CLONE\_SETTLS}]
+\item[\const{CLONE\_SIGHAND}]
+\item[\const{CLONE\_STOPPED}]
+\item[\const{CLONE\_SYSVSEM}]
+\item[\const{CLONE\_THREAD}]
+\item[\const{CLONE\_UNTRACED}]
+\item[\const{CLONE\_VFORK}]
+\item[\const{CLONE\_VM}]
+\end{basedescript}
\subsection{La funzione \func{prctl}}
Da fare
+% TODO: trattare PTRACE_SEIZE, aggiunta con il kernel 3.1
+
+
\subsection{L'accesso alle porte di I/O}
\label{sec:process_io_port}
% LocalWords: SIGKILL static RLIMIT preemption PREEMPT VOLUNTARY IDLE RTPRIO
% LocalWords: completely fair compat uniform CFQ queuing elevator dev cfq RT
% LocalWords: documentation block syscall ioprio IPRIO CLASS class best effort
-% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE SIGCHL WALL big
+% LocalWords: refresh semop dnotify MADV DONTFORK prctl WCLONE WALL big
% LocalWords: WNOTHREAD DUMPABLE KEEPCAPS IRIX CAPBSET endianess endian flags
% LocalWords: little PPC PowerPC FPEMU NOPRINT SIGFPE FPEXC point FP SW malloc
% LocalWords: exception EXC ENABLE OVF overflow UND underflow RES INV DISABLED