Newsgroup: it.comp.os.linux.development
Titolo: setenv e variabili d'ambiente

Ciao a tutti, vi vorrei esporre un problema.
Se io faccio il mio bel file pippo.c in questo modo:
#include "stdlib.h"
#include "stdio.h"
void main(void)
{
   setenv("PIPPO", "cammello", 1);
}
e lo compilo così:
cc pippo.c -o pippo
ricavo l'eseguibile pippo, che faccio girare.
Mi aspetto che venga creata una variabile d'ambiente che si chiama
PIPPO con valore "cammello", ma quando poi scrivo sul prompt
env | grep PIPPO
non mi esce nulla, in effetti se controllo tra le variabili di
ambiente, la variabile PIPPO non compare.
Qualcuno sa dirmi perché?
Sicuramente mi sto perdendo in un bicchier d'acqua e non conosco bene
l'utilizzo della funzione setenv(), mi sapete dire dove sbaglio?
Vi ringrazio moltissimo,
Pietro
P.S.: ho fatto gli stessi test anche istanziando dei const char*, e
passandoli alla funzione setenv() come da prototipo, ma con gli stessi
risultati...

 la variabile PIPPO non compare.
Perche` stai modificando l'ambiente del tuo programma, e non quello della 
shell.
In pratica, quelle modifiche le vede solo il tuo programma, e nessun'altro.
Bye.


Anche i figli del programma vedranno le modifiche...
Per cambiare il tuo environment devi eseguire i comandi nello shell. Io vedo due 
modi per farlo:
1) env diventa uno shell che interpreti (. env)
2) env stampa una serie di statement shell che poi interpreti (eval `env` dove 
env stampa qualcosa del tipo 'echo PIPPO="pippo"; echo PLUTO="pluto"')
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 Switzerland                                 E-Mail: 
Roberto.Di...@cern.ch
Vi ringrazio per l'aiuto che mi avete dato, e a questo punto una
domanda sorge spontanea:
e come posso fare a creare variabili di ambiente direttamente da
codice senza ricorrere agli script?

 codice senza ricorrere agli script?
domanda: *perchč* hai bisogno di creare variabili d'ambiente da codice? 
Forse stai cercando di fare qualcosa che č piů facile fare in altro modo..
-- 
SF
"Breaking something which works as intended in order to solve a problem 
existing in delusion-space is not usually called 'a workaround'."

 existing in delusion-space is not usually called 'a workaround'."
volevo semplicemente fare un qualcosa del genere:
il mio sw gira e in realtime capisce che deve fare e, tramite
variabili di ambiente, lo comunica ad altri processi (cercando di non
fare accessi a file su hd).
Avevo pensato alle variabili di ambiente per fare questo, ma se alla
fine è un problema posso sempre cambiare approccio,
Vi ringrazio moltissimo per l'aiuto che mi state dando,
Pietro

 moltissimo per l'aiuto che mi state dando,
Come ha detto Roberto, se gli altri software sono figli del tuo (quindi 
fork(), in pratica), vedono le tue modifiche all'ambiente, altrimenti no.
Valuta altri sistemi. Se non vuoi usare file su disco esistono diverse IPC 
in Linux: pipe, socket, ...
Bye.


Giusto, vi ringrazio per l'aiuto,
Pietro

 codice senza ricorrere agli script?
la sai questa vecchia storiella in bash?
$ a=prima
$ echo dopo | read a
$ echo $a
prima
siccome c'e' una pipe, per eseguire il comando read viene eseguito un 
sottoprocesso
tutto l'ambiente viene copiato
quindi "a" viene modificata, ma non la "a" originale... la copia.
poi il sottoprocesso finisce, e nulla resta.
$ a=prima
$ echo dopo | { read a; echo $a; }
dopo
$ echo $a
prima
non c'e' modo di scrivere indietro... da un processo "filgio" non e' 
possibile modificare l'ambiente del "genitore"

 fine è un problema posso sempre cambiare approccio,
se i detti processi son figli del processo nel quale cambi le variabili 
d'ambiente, allora il giochino funziona.



Esatto. Io farei cosi`: crei un blocco di memoria condivisa (shmget) e poi metti 
i comandi li` dentro. Efficace e semplicissimo, in particolare se le 
comunicazioni vanno solo da padre a figlio. Basta caricare (in entrambi i 
processi) un puntatore e via. Se invece le comunizioni vanno in bidirezionale 
allora avrai bisogno di un sistema di scambio di messaggi, ma anche questo e` 
facile da implementare con un blocco di memoria condivisa.
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 Bye.
Ciao
Gg

 
ottimo, ti ringrazio, mi hai appena aiutato a trovare un bug :-)
