2013-05-27 12 views
6

So che durante la programmazione in C++ posso accedere alle singole variabili di ambiente con getenv.Come elencare tutte le variabili di ambiente in un'applicazione c/C++

So anche che, nel terminale os x, è possibile elencare TUTTE le variabili di ambiente correnti utilizzando env.

Sono interessato a ottenere un elenco completo delle variabili di ambiente disponibili per il mio programma C++ in esecuzione. Esiste una funzione c/C++ che li elencherà? In altre parole, c'è un modo per chiamare env dal mio codice C++?

+2

La magia è qui: [env.c] (http://minnie.tuhs.org/cgi-bin/utree.pl?file=OpenSolaris_b135/cmd/env/ env.c). – dasblinkenlight

+0

Il comando shell è 'env', non' ENV' (ho modificato la tua domanda per risolverlo). –

risposta

10

utilizzare la variabile globale environ. È un puntatore a terminazione null di un array di stringhe nel formato name=value. Ecco un clone in miniatura di env:

#include <stdlib.h> 
#include <stdio.h> 

extern char **environ; 

int main(int argc, char **argv) { 
    for(char **current = environ; *current; current++) { 
     puts(*current); 
    } 
    return EXIT_SUCCESS; 
} 
+0

Infatti. 'man getenv' ha in fondo (su OS X, che l'OP cita) una sezione' VEDERE ANCHE' che menziona 'environ (7)'. Quindi 'uomo environ' fornisce una pagina di manuale che spiega questo. 'apropos environment' include anche questa pagina. Questo non è inteso come RTFM, ma un suggerimento per l'OP che le sezioni di "VEDERE ANCHE" di manpage possono valere la pena di essere verificate. –

11

Si può essere in grado di utilizzare il envp argomento non portabile verso main:

int main(int argc,char* argv[], char** envp) 

e come bonus a quanto pare su OSX avete apple che ti dà altri OS informazioni forniti:

int main(int argc, char **argv, char **envp, char **apple) 

Ma a cosa serve? Bene, Apple può usare il vettore apple per passare i parametri "nascosti" che vogliono a qualsiasi programma. E lo usano anche loro. Attualmente, apple [0] contiene il percorso in cui è stato trovato il file eseguibile sul disco. Cosa dici? In che modo la mela [0] è diversa da argv [0]? La differenza è che argv [0] può essere impostato su qualsiasi valore arbitrario quando viene chiamato execve (2). Ad esempio, conchiglie spesso differenziano una shell di login da una shell regolare partendo shell di login con il primo carattere di argv [0] essendo un -

0

Ops, ho dimenticato che system consente di eseguire comandi da terminale.

Questo frammento mi dà quello che mi serve:

std::cout << "List of environment variables: << std::endl; 
system("env"); 
+0

Ciò non rende la variabile disponibile per il tuo programma, ma li stampa sullo standard output. –

Problemi correlati