X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=d7d22ccf329b1e7724503646517451a47384d7a9;hp=42781334410eabf708cd15968f1355cd99a8419f;hb=0c7fb286c2c1b480ed81f7ce8d506b179e5d291e;hpb=487b554b85cda92d10367d5af69a0355b9b2329d diff --git a/process.tex b/process.tex index 4278133..d7d22cc 100644 --- a/process.tex +++ b/process.tex @@ -131,7 +131,7 @@ prototipo della funzione Causa la conclusione ordinaria del programma restituendo il valore \var{status} al processo padre. - La funzione non ritorna. Il processo viene terminato + \bodydesc{La funzione non ritorna. Il processo viene terminato.} \end{prototype} La funzione \func{exit} è pensata per una conclusione pulita di un programma @@ -150,7 +150,7 @@ prototipo della funzione Causa la conclusione immediata del programma restituendo il valore \var{status} al processo padre. - La funzione non ritorna. Il processo viene terminato. + \bodydesc{La funzione non ritorna. Il processo viene terminato.} \end{prototype} La funzione chiude tutti i file descriptor appartenenti al processo (si tenga @@ -182,11 +182,11 @@ certo numero funzioni che verranno eseguite all'uscita dal programma (sia per la chiamata ad \func{exit} che per il ritorno di \func{main}). La prima funzione che si può utilizzare a tal fine è: \begin{prototype}{stdlib.h}{void atexit(void (*function)(void))} - Registra la funzione \var{function} per essere chiamata all'uscita dal + Registra la funzione \param{function} per essere chiamata all'uscita dal programma. - - La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, - \texttt{errno} non viene settata. + + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + fallimento, \var{errno} non viene settata.} \end{prototype} La funzione richiede come argomento l'indirizzo della opportuna da chiamare @@ -199,9 +199,9 @@ sistemi), il cui prototipo Registra la funzione \var{function} per essere chiamata all'uscita dal programma. Tutte le funzioni registrate vengono chiamate in ordine inverso rispetto a quello di registrazione. - - La funzione restituisce 0 in caso di successo e -1 in caso di fallimento, - \var{errno} non viene settata. + + \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di + fallimento, \var{errno} non viene settata.} \end{prototype} In questo caso la funzione da chiamare prende due parametri, il primo dei @@ -603,15 +603,16 @@ 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{int *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. + 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 + programma di \var{increment}. Un valore zero restituisce l'attuale posizione + della fine del segmento dati. La funzione restituisce il puntatore all'inizio della nuova zona di memoria allocata in caso di successo e \macro{NULL} in caso di fallimento, nel qual @@ -710,8 +711,6 @@ Le funzioni per bloccare e sbloccare singole sezioni di memoria sono sono mantenute in RAM per tutta la durata del blocco. \funcdecl{int munlock(const void *addr, size\_t len)} - Alloca \var{size} byte nello heap. La memoria non viene inizializzata. - Sblocca l'intervallo di memoria da \var{addr} per \var{len} byte. @@ -812,12 +811,12 @@ Per gestire le opzioni all'interno dei argomenti a linea di comando passati in che ha il seguente prototipo: \begin{prototype}{unistd.h} {int getopt(int argc, char * const argv[], const char * optstring)} -La funzione esegue il parsing degli argomenti passati da linea di comando +Esegue il parsing degli argomenti passati da linea di comando riconoscendo le possibili opzioni segnalate con \var{optstring}. -Ritorna il carattere che segue l'opzione, \cmd{':'} se manca un parametro -all'opzione, \cmd{'?'} se l'opzione è sconosciuta, e -1 se non esistono altre -opzioni. +\bodydesc{Ritorna il carattere che segue l'opzione, \cmd{':'} se manca un + parametro all'opzione, \cmd{'?'} se l'opzione è sconosciuta, e -1 se non + esistono altre opzioni.} \end{prototype} Questa funzione prende come argomenti le due variabili \var{argc} e \var{argv} @@ -1019,8 +1018,9 @@ valori delle variabili di ambiente, il suo prototipo Esamina l'ambiente del processo cercando una stringa che corrisponda a quella specificata da \param{name}. - La funzione \macro{NULL} se non trova nulla, o il puntatore alla stringa che - corrisponde (di solito nella forma \texttt{NOME=valore}). + \bodydesc{La funzione ritorna \macro{NULL} se non trova nulla, o il + puntatore alla stringa che corrisponde (di solito nella forma + \texttt{NOME=valore}).} \end{prototype} Oltre a questa funzione di lettura, che è l'unica definita dallo standard ANSI @@ -1052,22 +1052,27 @@ previste nei vari standard unix e disponibili in Linux \label{tab:proc_env_func} \end{table} -In Linux solo le prime quattro funzioni di \curtab\ sono definite; i prototipi -delle restanti tre sono i seguenti: - +In Linux solo le prime quattro funzioni di \curtab\ sono definite; delle tre +restanti le prime due, \func{putenv} e \func{setenv} servono per assegnare +nuove variabili di ambiente, i loro prototipi sono i seguenti: \begin{functions} - \headdecl{stdlib.h} - \funcdecl{int putenv(char *string)} - La funzione aggiunge la stringa \param{string} all'ambiente. + \headdecl{stdlib.h} + + \funcdecl{int putenv(char *string)} Aggiunge la stringa \param{string} + all'ambiente. + \funcdecl{int setenv(const char *name, const char *value, int overwrite)} - La funzione setta la variabile di ambiente \param{name} al valore - \param{value}. + Setta la variabile di ambiente \param{name} al valore \param{value}. + + \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 per un + errore, che è sempre \macro{ENOMEM}.} +\end{functions} +\noindent la terza è: +\begin{functions} + \headdecl{stdlib.h} - Entrambe le funzioni ritornano 0 in caso di successo e -1 per un errore, che - è sempre \macro{ENOMEM}. - \funcdecl{void unsetenv(const char *name)} - La funzione rimuove la variabile di ambiente \param{name}. + Rimuove la variabile di ambiente \param{name}. \end{functions} Per cancellare una variabile di ambiente si usa \func{unsetenv}, che elimina @@ -1191,21 +1196,32 @@ efficiente, quello dell'uscita in caso di errore. Il C però non consente di effettuare un salto ad una label definita in un'altra funzione, per cui se l'errore avviene in funzioni profondamente -annidate occorre usare la funzioni \func{setjmp} e \func{longjmp}, il cui -prototipo è: +annidate occorre usare quello che viene chiamato un salto \textsl{non-locale}; +questo viene fatto usando salvando il contesto dello stack nel punto in cui si +vuole tornare in caso di errore, e ripristinandolo quando l'occorrenza capita. + + +La funzione che permette di salvare il contesto dello stack è \func{setjmp}, +il cui prototipo è: \begin{functions} \headdecl{setjmp.h} \funcdecl{void setjmp(jmp\_buf env)} - La funzione salva il contesto dello stack in \param{env} per un successivo - uso da parte di \func{longjmp}. Il contesto viene invalidato se la routine - che ha chiamato \func{setjmp} ritorna. + Salva il contesto dello stack in \param{env} per un successivo uso da parte + di \func{longjmp}. Il contesto viene invalidato se la routine che ha + chiamato \func{setjmp} ritorna. - La funzione ritorna zero quando è chiamata direttamente e un valore diverso - da zero quando ritorna da una chiamata di \func{longjmp} che usa il contesto - salvato in precedenza. + \bodydesc{La funzione ritorna zero quando è chiamata direttamente e un + valore diverso da zero quando ritorna da una chiamata di \func{longjmp} + che usa il contesto salvato in precedenza.} +\end{functions} + +Per poter effettuare un salto non locale si usa la funzione \func{longjmp}; il +suo prototipo è: +\begin{functions} + \headdecl{setjmp.h} \funcdecl{void longjmp(jmp\_buf env, int val)} Ripristina il contesto dello stack salvato dall'ultima chiamata di @@ -1213,6 +1229,6 @@ prototipo di \func{setjmp} con un valore \param{val}. Il valore di \param{val} deve essere diverso da zero, se viene specificato 0 sarà usato 1 al suo posto. - La funzione non ritorna. + \bodydesc{La funzione non ritorna.} \end{functions}