X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=93ac41119150c0af0bb9222a3f4164b3c1b4c03d;hp=d7d22ccf329b1e7724503646517451a47384d7a9;hb=bd18ae03e4b95cf99bec30653520049c75e6d028;hpb=0c7fb286c2c1b480ed81f7ce8d506b179e5d291e diff --git a/process.tex b/process.tex index d7d22cc..93ac411 100644 --- a/process.tex +++ b/process.tex @@ -2,29 +2,28 @@ \label{cha:process_interface} Come accennato nell'introduzione il processo è l'unità di base con cui un -sistema unix alloca ed utilizza le risorse. Questo capitolo tratterà -l'interfaccia base fra il sistema e i processi, su come vengono passati i -parametri, come viene gestita e allocata la memoria, su come un processo può -richiedere servizi al sistema, su cosa deve fare quando ha finito la sua +sistema unix-like alloca ed utilizza le risorse. Questo capitolo tratterà +l'interfaccia base fra il sistema e i processi, come vengono passati i +parametri, come viene gestita e allocata la memoria, come un processo può +richiedere servizi al sistema e cosa deve fare quando ha finito la sua esecuzione. Nella sezione finale accenneremo ad alcune problematiche generiche di programmazione. In genere un programma viene eseguito quando un processo lo fa partire eseguendo una funzione della famiglia \func{exec}; torneremo su questo e -sulla la creazione e gestione dei processi nel prossimo capitolo, in questo +sulla creazione e gestione dei processi nel prossimo capitolo. In questo affronteremo l'avvio e il funzionamento di un singolo processo partendo dal -punto di vista del programma posto in esecuzione. - +punto di vista del programma che viene messo in esecuzione. \section{Esecuzione e conclusione di un programma} -Una delle concetti base relativi ai processi è che un processo esegue sempre -uno ed un solo programma: si possono avere più processi che eseguono lo stesso -programma ma ciascun processo vedrà la sua copia del codice (in realtà il -kernel fa si che tutte le parti uguali siano condivise) avrà un suo spazio di -indirizzi, variabili proprie e sarà eseguito in maniera completamente -indipendente da tutti gli altri. +Uno dei concetti base di Unix è che un processo esegue sempre uno ed un solo +programma: si possono avere più processi che eseguono lo stesso programma ma +ciascun processo vedrà la sua copia del codice (in realtà il kernel fa si che +tutte le parti uguali siano condivise), avrà un suo spazio di indirizzi, +variabili proprie e sarà eseguito in maniera completamente indipendente da +tutti gli altri. Anche quando all'interno di un programma possono essere presenti più \textsl{filoni} di esecuzione (i cosiddetti \textit{thread}), o questo possa @@ -38,14 +37,14 @@ parte per la peculiarit \label{sec:proc_main} Quando un programma viene lanciato il kernel esegue una opportuna routine di -avvio, usando il programma \cmd{ld-linux.so}, è questo programma che prima -carica le librerie condivise che servono al programma, effettua il link -dinamico del codice e poi alla fine lo esegue. Infatti, a meno di non aver -specificato il flag \texttt{-static} durante la compilazione, tutti i -programmi in Linux sono incompleti e necessitano di essere linkati alle -librerie condivise quando vengono avviati. La procedura è controllata da -alcune variabili di ambiente e dal contenuto di \file{/etc/ld.so.conf}, i -dettagli sono riportati nella man page di \cmd{ld.so}. +avvio, usando il programma \cmd{ld-linux.so}. Questo programma prima carica +le librerie condivise che servono al programma, poi effettua il link dinamico +del codice e alla fine lo esegue. Infatti, a meno di non aver specificato il +flag \texttt{-static} durante la compilazione, tutti i programmi in Linux sono +incompleti e necessitano di essere linkati alle librerie condivise quando +vengono avviati. La procedura è controllata da alcune variabili di ambiente e +dal contenuto di \file{/etc/ld.so.conf}. I dettagli sono riportati nella man +page di \cmd{ld.so}. Il sistema fa partire qualunque programma chiamando la funzione \func{main}; sta al programmatore chiamare così la funzione principale del programma da cui @@ -603,14 +602,14 @@ analoghe system call a cui fanno da interfaccia (ad esempio per implementare una propria versione di \func{malloc}. Le funzioni sono: \begin{functions} \headdecl{unistd.h} - \funcdecl{int brk(void * end\_data\_segment)} + \funcdecl{int brk(void *end\_data\_segment)} Sposta la fine del segmento dei dati all'indirizzo specificato da \var{end\_data\_segment}. La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, nel qual caso \var{errno} viene settata a \macro{ENOMEM}. - \funcdecl{void * sbrk(ptrdiff\_t increment)} Incrementa lo spazio dati di un + \funcdecl{void *sbrk(ptrdiff\_t increment)} Incrementa lo spazio dati di un programma di \var{increment}. Un valore zero restituisce l'attuale posizione della fine del segmento dati. @@ -1168,6 +1167,17 @@ informazioni sulle dimensioni delle strutture degli indirizzi utilizzate, viene usato questo meccanismo. +\subsection{Il passaggio di un numero variabile di argomenti} +\label{sec:proc_variadic} + +Come vedremo nei capitoli successivi, non sempre è possibile specificare +un numero fisso di parametri per una funzione. Lo standard ISO C +prevede la possibilità di definire delle \textit{varadic function} che +abbiano un numero variabile di argomenti, ma non provvede nessun +meccanismo con cui queste funzioni possono accedere a questi argomenti. + +(NdT il resto è da fare). + \subsection{Potenziali problemi con le variabili automatiche} \label{sec:proc_auto_var}