From: Simone Piccardi Date: Tue, 17 Jul 2012 08:52:39 +0000 (+0000) Subject: Materiale su CLONE_FILES X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=570997eb16e7228f83d94108b9cb095b7c7a0f2a;p=gapil.git Materiale su CLONE_FILES --- diff --git a/fileio.tex b/fileio.tex index 74193f4..8b49534 100644 --- a/fileio.tex +++ b/fileio.tex @@ -121,13 +121,14 @@ che il kernel mantiene per ciascun file e ciascun processo. Come si può notare alla fine il collegamento che consente di porre in relazione i file ed i processi è effettuato attraverso i dati mantenuti nella -struttura \kstruct{files\_struct}, essa infatti contiene alcune informazioni +struttura \kstruct{files\_struct} essa infatti contiene alcune informazioni essenziali come: \begin{itemize*} \item i flag relativi ai file aperti dal processo. \item il numero di file aperti dal processo. -\item una tabella di puntatori alla relativa voce nella \itindex{file~table} - \textit{file table} per ciascun file aperto. +\item la \itindex{file~descriptor~table} \textit{file descriptor table}, una + tabella con i puntatori, per ciascun file aperto, alla relativa voce nella + \itindex{file~table} \textit{file table}. \end{itemize*} In questa infrastruttura un \textit{file descriptor} non è altro che l'intero diff --git a/prochand.tex b/prochand.tex index 97fc8ff..3a142fc 100644 --- a/prochand.tex +++ b/prochand.tex @@ -3975,13 +3975,13 @@ Dato che tutto ciò è necessario solo per i \textit{thread} che condividono la memoria, la \textit{system call}, a differenza della funzione di libreria che vedremo a breve, consente anche di passare per \param{child\_stack} il valore \val{NULL}, che non imposta un nuovo \textit{stack}. Se infatti si crea un -processo, questo ottiene un suo nuovo spazio degli indirizzi,\footnote{è - sottinteso cioè che non si stia usando il flag \const{CLONE\_VM} che vedremo - a breve.} ed in questo caso si applica la semantica del -\itindex{copy~on~write} \textit{copy on write} illustrata in -sez.~\ref{sec:proc_fork}, per cui le pagine dello \textit{stack} verranno -automaticamente copiate come le altre e il nuovo processo avrà un suo -\textit{stack} totalmente indipendente da quello del padre. +processo, questo ottiene un suo nuovo spazio degli indirizzi (è sottinteso +cioè che non si stia usando il flag \const{CLONE\_VM} che vedremo a breve) ed +in questo caso si applica la semantica del \itindex{copy~on~write} +\textit{copy on write} illustrata in sez.~\ref{sec:proc_fork}, per cui le +pagine dello \textit{stack} verranno automaticamente copiate come le altre e +il nuovo processo avrà un suo \textit{stack} totalmente indipendente da quello +del padre. Dato che l'uso principale della nuova \textit{system call} è quello relativo alla creazione dei \textit{thread}, la \acr{glibc} definisce una funzione di @@ -4041,7 +4041,7 @@ utilizzati soltanto se si sono specificati rispettivamente i flag La funzione ritorna un l'identificatore del nuovo \textit{task}, denominato \texttt{Thread ID} (da qui in avanti \ids{TID}) il cui significato è analogo al \ids{PID} dei normali processi e che a questo corrisponde qualora si crei -un processo. +un processo ordinario e non un \textit{thread}. Il comportamento di \func{clone}, che si riflette sulle caratteristiche del nuovo processo da essa creato, è controllato principalmente @@ -4054,9 +4054,28 @@ elenco, che illustra quelle attualmente disponibili:\footnote{si fa \begin{basedescript}{\desclabelwidth{2.cm}\desclabelstyle{\nextlinelabel}} \item[\const{CLONE\_CHILD\_CLEARTID}] cancella il valore del \ids{TID} -\item[\const{CLONE\_CHILD\_SETTID}] -\item[\const{CLONE\_FILES}] -\item[\const{CLONE\_FS}] + all'indirizzo dato dall'argomento \param{ctid}, eseguendo un riattivazione + del \textit{futex} (vedi sez.~\ref{sec:xxx_futex}) a quell'indirizzo; questo + flag viene utilizzato dalla librerie di gestione dei \textit{thread}. +\item[\const{CLONE\_CHILD\_SETTID}] scrive il \ids{TID} del \textit{thread} + figlio all'indirizzo dato dall'argomento \param{ctid}. Questo flag viene + utilizzato dalla librerie di gestione dei \textit{thread}. +\item[\const{CLONE\_FILES}] se impostato il nuovo processo condividerà con il + padre la \itindex{file~descriptor~table} \textit{file descriptor table} + (vedi sez.~\ref{sec:file_fd}), questo significa che ogni \textit{file + descriptor} aperto da un processo verrà visto anche dall'altro e che ogni + chiusura o cambiamento dei \textit{file descriptor flag} di un \textit{file + descriptor} verrà per entrambi. + + Se non viene impostato il processo figlio eredita una copia della  + \itindex{file~descriptor~table} \textit{file descriptor table} del padre e + vale la semantica classica della gestione dei \textit{file descriptor}, che + costituisce il comportamento ordinario di un sistema unix-like e che + illustreremo in dettaglio in sez.~\ref{sec:file_shared_access}. + +\item[\const{CLONE\_FS}] se questo flag viene impostato il nuovo processo + condividerà con il padre le informazioni + \item[\const{CLONE\_IO}] \item[\const{CLONE\_NEWIPC}] \item[\const{CLONE\_NEWNET}]