Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

Kylix, Libc.pas: variabili d'ambiente

        Scritto: Giansante Gabriele, 2002     

L'ambiente e' un vettore di stringhe con formato
  nome_variabile=valore_variabile
proprio di una shell e messo a disposizione delle applicazioni che vengono eseguite.
Vi si possono trovare informazioni sulla shell usata, sul nome dell'host, sull'utente, ecc. L'ambiente viene generealmente usato per passare dei valori ben precisi ai programmi. Ad esempio, il comando "java" (jdk: http://java.sun.com), usa la variabile d'ambiente "CLASSPATH" per sapere dove andare a cercare le classi per l'esecuzione di applicazioni java.

Un tipico esempio di utilizzo dell'ambiente, puo' essere l'indicazione della directory contenente i file di configurazione di un programma.

Dalla shell e' possibile digitare "env" per leggere le viariabili di ambiente. Ogni shell non e' detto che abbia le stesse variabili. Esiste una serie di variabili assegnate alla shell appena viene aperta, ed una serie di variabili che possono essere state aggiunte successivamente. Avendo ogni shell una vita a parte, quindi si possono avere vettori diversi.
Una variabile d'ambiente puo' essere eliminata, modificata o aggiunta. Inoltre si possono eliminare tutte quelle non di sistema (SHELL, TERM, ed altre non possono essere eliminate: esempio 1 nel codice Kylix mostrato).
Un programma kylix puo' compiere tali operazioni grazie alla seguenti funzioni/procedure dichiarate nella libreria "Libc.pas":
  function clearenv: integer;
  function getenv(nome: PChar):PChar;
  function putenv(riga: PChar):integer;
  function setenv(nome: PChar; valore: PChar; sovrascrivi: integer):integer;
  procedure unsetenv(nome: PChar);
Le dichiarazioni mostrate sono una traduzione in Object Pascal delle analoghe presenti in "/usr/include/stdlib.h".

Di seguito viene data una spiegazione veloce delle singole funzioni, da integrare con il codice mostrato alla fine.
  • clearenv: elimina quasi tutte le variabili d'ambiente, fra cui quelle definite dall'utente (Esempio 1).
       var retval: integer;
       [...]
       retval := clearenv;
    
  • putenv: inserisce/modifica una variabile d'ambiente (Esempio 2). Accetta una stringa del tipo ("nome=variabile"). Se la variabile non esiste, viene creata, se esiste, invece viene sovrascritta.
    Il valore restituito e' 0 in caso di successo, -1 altrimenti (il codice di errore va letto a parte).
       var 
         retval: integer;
         temp: String;
       [...]
       temp := 'prova=qwerty';
       retval := putenv(PChar(temp));
       [...]
       retval := putenv('prova2=1234567890');
    
  • setenv: come putenv, inserisce/modifica una variabile d'ambiente (Esempio 3). A differenza di putenv, pero' possono essere specificati separatamente il nome ed il valore. Inoltre e' possibile, tramite il parametro "sovrascrivi", evitare di sovrascrivere una variabile gia' esistente.
      sovrascrivi=0 : l'eventuale variabile gia' presente non viene sovrascritta.
      sovrascrivi=n : con n diverso da 0, l'eventuale variabile gia' presente viene sovrascritta.
    
    Ovviamente, se la variabile non esiste, viene inserita a meno di errori di altra natura.
    Restituisce 0 se l'operazione ha successo, -1 se non c'e' abbastanza spazio nell'ambiente per inserire nuovi valori.
       var 
         retval: integer;
       [...]
       retval := setenv('prova','qwerty',0);
       [...]
       retval := setenv('prova','asdfgh',1);
    
  • getenv: restituisce il valore di una variabile d'ambiente (Esempio 4). Se la variabile indicata non esiste, non restituisce niente (nil).
       var 
         valore: String;
         temp: String
       [...]
       valore := String(getenv('prova'));
       [...]
       temp := 'prova2';
       valore := String(getenv(PChar(temp)));
    
    In realta' il cast a String da PChar sul risultato di getenv non e' necessario in quanto effettuato automaticamente. Qui' lo mettiamo per evidenziare la restituzione di un tipo diverso da String. Si sarebbe potuto scrivere tranquillamente "valore := getenv(...);".
  • unsetenv: permette di eliminare una variabile precedentemente inserita (Esempio 5). Questa procedura non dovrebbe essere usata con variabili non esistenti oppure con le variabili che non vengono eliminate da clearenv.
       unsetenv('prova');
    
Infine, ecco il codice con cui sperimentare l'utilizzo delle variabili d'ambiente in Kylix. Per utilizzare gli esempi, procedere come segue:
  • Creare un nuovo progetto come console application (File->New...->Console Application). Tipicamente avra' il nome "Project1".
  • Al posto del sorgente visualizzato, copiare quello mostrato.
  • Per attivare un esempio particolare, eliminare i commenti relativi.
  • Salvare tutto.
  • Compilare il progetto (Project->Build Project1).
  • Da una shell posizionarsi nella directory dove sono stati salvati i file ed eseguire il comando "./Project1".
  • Per verificare il risultato, confrontare i file "ambiente_prima.txt" e "ambiente_dopo.txt" relativi rispettivamente alla situazione prima dell'esecuzione dell'esempio ed a quella dopo l'esecuzione.
//Project1.dpr
//------------

{
   Programma di esempio per l'utilizzo delle variabili
   d'ambiente in kylix.

   Linux&Me - http://www.feelinglinux.com

   Giansante Gabriele (c) 2002
}

program testenv;

{$APPTYPE CONSOLE}

uses
      Libc,SysUtils;

var
      //Valore rappresentante l'esito dell'esecuzione
      //di alcune funzioni
      retval: integer;

      //Nome e valore di una variabile d'ambiente
      nome,valore: String;
      //Utilizzata per "setenv", indica se sovrascrivere una
      //variabile eventualmente gia' presente
      sovrascrivi: integer;

begin

      //Inseriamo nell'ambiente la variabile test che
      //servira' come ausilio per gli esempi successivi.
      //Per vederne il funzionamento, osservare l'esempio 2.
      putenv('test=1');

      //L'ambiente prima delle manipolazioni degli esempi:
      //leggere il file ambiente_prima.txt
      retval := Libc.system('env>ambiente_prima.txt');
      writeln(IntToStr(retval)+': env>ambiente_prima.txt');

      {*************************************************}

      {
        Esempio 1 - clearenv
        --------------------
        Eliminazione delle variabili d'ambiente non essenziali
        (quelle rimaste non possono essere cancellate con
        "unsetenv").
      }

      retval := clearenv;
      writeln(IntToStr(retval)+': clearenv');

      {
        Esempio 2 - putenv
        ------------------
        Inserimento di una variabile d'ambiente con "putenv".
      }

      //nome := 'cavoli';
      //valore := 'a merenda';
      //retval := putenv(PChar(nome+'='+valore));
      //writeln(IntToStr(retval)+': putenv');

      {
        Esempio 3 - setenv
        ------------------
        Inserimento variabile d'ambiente con setenv.
        "sovrascrivi" vale 0, quindi non accade niente.
        Per settare effettivamente la variabile "test" a 2,
        commentare la riga "putenv('test=1')" oppure
        assegnare 1 a "sovrascrivi".
        valore='2'; sovrascrivi=0 Non cambia niente
        valore='2'; sovrascrivi=1 "test" passa da 1 a 2
      }

      //nome := 'test';
      //valore := '2';
      //sovrascrivi := 0;
      //retval := setenv(PChar(nome),PChar(valore),sovrascrivi);
      //writeln(IntToStr(retval)+': setenv');

      {
        Esempio 4 - getenv
        ------------------
        Lettura variabile d'ambiente con getenv.
        Valore risulta vuoto se la variabile non esiste.
        Ad esempio, se proviamo ad usare "test2", "writeln"
        stampa ": setenv".
      }

      //nome := 'SHELL';
      //valore := String(getenv(PChar(nome)));
      //writeln(valore+': getenv');

      {
        Esempio 5 - unsetenv
        --------------------
        Eliminazione variabile "test" dall'ambiente con
        unsetenv.
        Se nell'esempio era stata commentata la riga
        "putenv('test=1')", levare il commento.
	ATTENZIONE: Non usare nomi non esistenti oppure i nomi 
	che rimangono dopo l'applicazione di "clearenv" (esempio 1).
	dopo
      }
      //nome := 'test';
      //unsetenv(PChar(nome));

      {*************************************************}

      //L'ambiente dopo le manipolazioni degli esempi:
      //leggere il file ambiente_dopo.txt
      retval := Libc.system('env>ambiente_dopo.txt');
      writeln(IntToStr(retval)+': env>ambiente_dopo.txt');

end.


Hai trovato utile questo articolo?
Aiutami a condividerlo o metti un "mi piace".
Grazie mille!


Gli strumenti di condivisione (Google+, Facebook) sono visibili in alto a destra solo dopo aver accettato la policy di utilizzo dei cookie per questo sito.
FAQ - Come faccio a cambiare la mia scelta?

 

Strumenti (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Cerca @myjsp.feelinglinux.com

Pubblicita'