L'uso di queste funzioni è necessario solo quando si voglia accedere alle
analoghe system call a cui fanno da interfaccia (ad esempio per implementare
una propria versione di \func{malloc}. Le funzioni sono:
-\begin{prototype}{unistd.h}{int *brk(void end\_data\_segment)}
+\begin{functions}
+ \headdecl{unistd.h}
+ \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}.
-\end{prototype}
-\begin{prototype}{unistd.h}{int *sbrk(ptrdiff\_t increment)}
+ \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 il puntatore all'inizio della nuova zona di memoria
allocata in caso di successo e \macro{NULL} in caso di fallimento, nel qual
caso \macro{errno} viene settata a \macro{ENOMEM}.
-\end{prototype}
+\end{functions}
Queste funzioni sono state deliberatamente escluse dallo standard POSIX.1 e
per i programmi normali è opportuno usare le funzioni di allocazione standard
\var{len} byte. Tutte le pagine che contengono una parte dell'intervallo
sono mantenute in RAM per tutta la durata del blocco.
- La funzione ritorna 0 in caso di successo e -1 in caso di errore, nel qual
- caso \var{errno} è settata ad uno dei valori seguenti:
- \begin{errlist}
- \item \macro{ENOMEM} alcuni indirizzi dell'intervallo specificato non
- corrispondono allo spazio di indirizzi del processo o si è ecceduto il
- numero massimo consentito di pagine bloccate.
- \item \macro{EPERM} il processo non ha i privilegi richiesti per
- l'operazione.
- \item \macro{EINVAL} \var{len} non è un valore positivo.
- \end{errlist}
-
\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. La
- funzione ritorna 0 in caso di successo e -1 in caso di errore, nel qual caso
- \var{errno} è settata ad uno dei valori seguenti:
+ Sblocca l'intervallo di memoria da \var{addr} per \var{len} byte.
+
+
+ \bodydesc{Entrambe le funzioni ritornano 0 in caso di successo e -1 in
+ caso di errore, nel qual caso \var{errno} è settata ad uno dei
+ valori seguenti:
\begin{errlist}
- \item \macro{ENOMEM} alcuni indirizzi dell'intervallo specificato non
- corrispondono allo spazio di indirizzi del processo.
- \item \macro{EINVAL} \var{len} non è un valore positivo.
+ \item[\macro{ENOMEM}] alcuni indirizzi dell'intervallo specificato non
+ corrispondono allo spazio di indirizzi del processo o si è ecceduto
+ il numero massimo consentito di pagine bloccate.
+ \item[\macro{EINVAL}] \var{len} non è un valore positivo.
\end{errlist}
+ e, per \func{mlock}, anche \macro{EPERM} quando il processo non ha i
+ privilegi richiesti per l'operazione.}
\end{functions}
Altre due funzioni, \func{mlockall} e \func{munlockall}, consentono di
\funcdecl{int mlockall(int flags)}
Blocca la paginazione per lo spazio di indirizzi del processo corrente.
- Codici di ritorno ed errori sono gli stessi di \func{mlock}.
-
\funcdecl{int munlockall(void)}
Sblocca la paginazione per lo spazio di indirizzi del processo corrente.
- Codici di ritorno ed errori sono gli stessi di \func{munlock}.
+ \bodydesc{Codici di ritorno ed errori sono gli stessi di \func{mlock}
+ e \func{munlock}.}
\end{functions}
Il parametro \var{flags} di \func{mlockall} permette di controllarne il
\cmd{--} la scansione viene considerata conclusa, anche se vi sono altri
elementi di \var{argv} che cominciano con il carattere \texttt{'-'}.
-\begin{figure}[htbp]
+\begin{figure}[htb]
\footnotesize
\begin{lstlisting}{}
opterr = 0; /* don't want writing to stderr */
La funzione setta la variabile di ambiente \param{name} al valore
\param{value}.
- Entrembe le funzioni ritornano 0 in caso di successo e -1 per un errore, che
+ 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}.
\end{functions}
-Per modificare o aggiungere una variabile di ambiente si possono usare le
-funzioni \func{putenv} e \func{setenv}. La prima prende come parametro una
-stringa analoga quella restituita da \func{getenv}, e sempre nella forma
-\texttt{NOME=valore}, se la variabile esiste verrà modificata, altrimenti sarà
-aggiunta. La seconda permette di specificare separatamente nome e valore,
-inoltre il valore di \param{overwrite} ne specifica il comportamento nel caso
-la variabile esista già, sovrascrivendola se diverso da zero, lasciandola
-immutata se uguale a zero.
-
Per cancellare una variabile di ambiente si usa \func{unsetenv}, che elimina
-ogni occorrenza della variabile, se questa non esiste non è considerato un
-errore.
-
+ogni occorrenza della variabile, se la variabile specificata non esiste non
+succede nulla, e non è previsto (dato che la funzione è \type{void}) nessuna
+segnalazione di errore.
+Per modificare o aggiungere una variabile di ambiente si possono usare le
+funzioni \func{setenv} e \func{putenv}. La prima permette di specificare
+separatamente nome e valore della variabile di ambiente, inoltre il valore di
+\param{overwrite} specifica il comportamento della funzione nel caso la
+variabile esista già, sovrascrivendola se diverso da zero, lasciandola
+immutata se uguale a zero.
+La seconda funzione prende come parametro una stringa analoga quella
+restituita da \func{getenv}, e sempre nella forma \texttt{NOME=valore}. Se la
+variabile specificata non esiste la stringa sarà aggiunta all'ambiente, se
+invece esiste il suo valore sarà settato a quello specificato da
+\func{string}. Si tenga presente che, seguendo lo standard SUSv2, le
+\acr{glibc} successive alla versione 2.1.2 aggiungono\footnote{il
+ comportamento è lo stesso delle vecchie \acr{libc4} e \acr{libc5}; nelle
+ \acr{glibc}, dalla versione 2.0 alla 2.1.1, veniva invece fatta una copia,
+ seguendo il comportamento di BSD4.4; dato che questo può dar luogo a perdite
+ di memoria e non rispetta lo standard il comportamento è stato modificato a
+ partire dalle 2.1.2, eliminando anche, sempre in conformità a SUSv2,
+ l'attributo \type{const} dal prototipo.} \func{string} alla lista delle
+variabili di ambiente; pertanto ogni cambiamento alla stringa in questione si
+riflette automaticamente sull'ambiente, e quindi si deve evitare di passare
+alla funzione variabili automatiche (per evitare i problemi esposti in
+\secref{sec:proc_auto_var}).
+
+Si tenga infine presente che se si passa a \func{putenv} solo il nome di una
+variabile (cioè \param{string} è nella forma \texttt{NAME} e non contiene un
+\var{=}) allora questa viene cancellata dall'ambiente. Infine se la chiamata
+di \func{putenv} comporta la necessità di allocare una nuova versione del
+vettore \var{environ} questo sarà allocato, ma la versione corrente sarà
+deallocata solo se anch'essa risultante da una allocazione fatta in precedenza
+da un'altra \func{putenv}, il vettore originale (in genere piazzato al di
+sopra dello stack, vedi \figref{fig:proc_mem_layout}), o la memoria associata
+alle variabili di ambiente eliminate non viene comunque liberata.
\section{Problematiche di programmazione generica}