X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=process.tex;h=d899675f0bbfe3411b486269ff45f7e0815ca686;hp=1ec17806a6050d8783953f63001809e0b4fad10f;hb=28d478465caab3b1ed140fd1a45c8a305f952be1;hpb=f5e0b5be624d5a5a0b7a414ec7e957b0f86b2a56;ds=sidebyside diff --git a/process.tex b/process.tex index 1ec1780..d899675 100644 --- a/process.tex +++ b/process.tex @@ -1068,28 +1068,51 @@ delle restanti tre sono i seguenti: 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}