next up previous contents index return to home!
Next: Variabili di ambiente Up: Processi Previous: Struttura di un processo   Indice   Indice analitico


Struttura di un programma C

Ogni programma scritto in C ha un entry-point che è la funzione main. Il suo prototipo più generale è:



int main (int argc, char *argv[]);

Il primo parametro rappresenta il numero di argomenti passati al programma sulla linea di comando, mentre il secondo parametro è il puntatore a un array di stringhe contenente gli argomenti veri e propri. Il primo argomento (contenuto nella stringa argv[0]) è sempre il nome del programma. Quindi argc vale sempre almeno 1.

Un processo può terminare in 5 modi diversi, 3 sono normali e 2 sono anormali:

I prototipi delle due funzioni exit sono elencati di seguito:



#include<stdlib.h>

void exit(int status);

#include<unistd.h>

void _exit(int status);


La exit() fa una ``pulizia'' dello stato del processo prima di uscire (tipicamente, chiude tutti i file e i descrittori aperti), mentre _exit() torna brutalmente al sistema. È anche possibile installare delle funzioni da chiamare prima dell'uscita tramite la funzione atexit().



#include<stdlib.h>

void atexit(void (*func)(void));


Ecco un esempio di utilizzo:

Esempio

La sequenza di chiamate fatte quando viene lanciato un processo, e mentre esso è in esecuzione, è riassunta in Figura 2.1: quando viene lanciato un processo, per prima cosa parte una routine di inizializzazione (non visibile all'utente), chiamata C Startup Routine. Poi, viene invocata la funzione main(). Se la funzione esce con return, si ritorna alla C Startup Routine, la quale invoca exit() passandogli il valore di ritorno ottenuto dal main. Il main (o una delle funzioni invocate dal main) a sua volta può invocare direttamente la funzione exit(), oppure la _exit(). La differenza è che la exit() fa una serie di cose, tra le quali invocare gli handler, ovvero quelle funzioni che sono state installate con la atexit(). Infine, sia la _exit() che la exit() ritornano al kernel, il quale fa un'ulteriore lavoro di pulizia, cancellando quasi tutte le strutture interne relative al processo. Nel capitolo 4, vedremo che in realtà alcune strutture rimancono comunque presenti fino a che il processo padre non chiama la wait().

Figura 2.1: Sequenza di chiamate fatte all'entrata e all'uscita di un processo.
\begin{figure}\centerline{\psfig{figure=figs/exit.eps,width=12cm}}\end{figure}



Subsections
next up previous contents index
Next: Variabili di ambiente Up: Processi Previous: Struttura di un processo   Indice   Indice analitico
Giuseppe Lipari 2002-10-27