From: Simone Piccardi Date: Sun, 7 Oct 2001 21:39:32 +0000 (+0000) Subject: Finita (quasi) exec X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=commitdiff_plain;h=60e1ec8addabb2a467b614535dfcfee3908618b0 Finita (quasi) exec --- diff --git a/fileintro.tex b/fileintro.tex index 4fc1e38..e7f2419 100644 --- a/fileintro.tex +++ b/fileintro.tex @@ -334,7 +334,7 @@ di filesystem differenti all'interno dello stesso albero delle directory Quando un processo esegue una system call che opera su un file il kernel chiama sempre una funzione implementata nel VFS; la funzione eseguirà le -manipolazioni sulle strutture generiche e utilizzaerà poi la chiamata alla +manipolazioni sulle strutture generiche e utilizzarà poi la chiamata alla opportune routine del filesystem specifico a cui si fa riferimento. Saranno queste a chiamare le funzioni di più basso livello che eseguono le operazioni di I/O sul dispositivo fisico, secondo lo schema riportato in \nfig. @@ -352,11 +352,11 @@ files; le operazioni sono suddivise su tre tipi di oggetti: filesystem, inode e file, corrispondenti a tre apposite strutture definite nel kernel. Il VFS usa una tabella mantenuta dal kernel che contiene il nome di ciascun -filesystem supportato, quando si vuole inserire il supporto di un nuovo -filesystem tutto quello che occorre è una chiamata alla funzione -\func{register\_filesystem} passando un'apposita struttura che -(\var{file\_system\_type}) contiene l'implementazione edl medesimo, che sarà -aggiunta alla citata tabella. +filesystem supportato: quando si vuole inserire il supporto di un nuovo +filesystem tutto quello che occorre è chiamare la funzione +\func{register\_filesystem} passandole un'apposita struttura +(\var{file\_system\_type}) che contiene i dettagli per il riferimento +all'implementazione del medesimo, che sarà aggiunta alla citata tabella. In questo modo quando viene effettuata la richiesta di montare un nuovo disco diff --git a/gapil.tex b/gapil.tex index f938099..f3c1743 100644 --- a/gapil.tex +++ b/gapil.tex @@ -1,4 +1,4 @@ -%% +%% %% GaPiL : Guida alla Programmazione in Linux %% %% S. Piccardi Feb. 2001 diff --git a/prochand.tex b/prochand.tex index 09e1b59..06f8e57 100644 --- a/prochand.tex +++ b/prochand.tex @@ -852,6 +852,7 @@ certezza che la chiamata a \func{wait} non si bloccher \begin{table}[!htb] \centering + \footnotesize \begin{tabular}[c]{|c|p{10cm}|} \hline \textbf{Macro} & \textbf{Descrizione}\\ @@ -1109,7 +1110,7 @@ indicato dal parametro \var{path}, che viene interpretato come il \begin{figure}[htb] \centering - \includegraphics[width=8cm]{img/exec_rel.eps} + \includegraphics[width=13cm]{img/exec_rel.eps} \caption{La inter-relazione fra le sei funzioni della famiglia \func{exec}} \label{fig:proc_exec_relat} \end{figure} @@ -1161,12 +1162,30 @@ altri file restano aperti. Questo significa che il comportamento di default che i file restano aperti attraverso una \func{exec}, a meno di una chiamata esplicita a \func{fcntl} che setti il suddetto flag. -Per le directory lo standard POSIX.1 richiede che esse vengano chiuse, in -genere questo è fatto automaticamente dalla funzione \func{opendir} che -effettua il settaggio del flag in maniera trasparente all'utente. - - - +Per le directory lo standard POSIX.1 richiede che esse vengano chiuse +attraverso una \func{exec}, in genere questo è fatto dalla funzione +\func{opendir} che effettua da sola il settaggio del flag di +\textit{close-on-exec} in maniera trasparente all'utente. + +Abbiamo detto che il \textit{real user ID} ed il \textit{real group ID} +restano gli stessi all'esecuzione di \func{exec}; lo stesso vale per +l'\textit{effective user ID} ed l'\textit{effective group ID}, tranne il caso +in cui il file che si va ad eseguire ha o il \acr{suid} bit o lo \acr{sgid} +bit settato, nel qual caso \textit{effective user ID} e \textit{effective + group ID} vengono settati rispettivamente all'utente o al gruppo cui il file appartiene. + +Se il file da eseguire è in formato \emph{a.out} e necessita di librerie +condivise, viene lanciato il \textit{linker} dinamico \cmd{ld.so} prima del +programma per caricare le librerie necessarie ed effettuare il link +dell'eseguibile. Se il programma è in formato ELF per caricare le librerie +dinamiche viene usato l'interprete indicato nel segmento \macro{PT\_INTERP}, +in genere questo è \file{/lib/ld-linux.so.1} per programmi linkati con le +\emph{libc5}, e \file{/lib/ld-linux.so.2} per programmi linkati con le +\emph{glibc}. Infine nel caso il file sia uno script esso deve iniziare con +una linea nella forma \cmd{#!/path/to/interpreter} dove l'interprete indicato +deve esse un valido programma (binario, non un altro script) che verrà +chiamato come se si fosse eseguitio il comando \cmd{interpreter [arg] + filename}. Con la famiglia delle \func{exec} si chiude il novero delle funzioni su cui è basato il controllo dei processi in unix: con \func{fork} si crea un nuovo