2010-01-18 24 views
46

¿Cómo obtengo la lista de todas las variables de entorno en C y/o C++?Imprimir todas las variables de entorno en C/C++

Sé que getenv se puede utilizar para leer una variable de entorno, pero ¿cómo puedo enumerarlas todas?

+0

la forma de llamar a la env utilizando el sistema (env)? – Vijay

Respuesta

84

Las variables de entorno se ponen a disposición main() como argumento envp - una matriz terminada nula de cuerdas:

int main(int argc, char **argv, char **envp) 
{ 
    for (char **env = envp; *env != 0; env++) 
    { 
    char *thisEnv = *env; 
    printf("%s\n", thisEnv);  
    } 
    return 0; 
} 
+0

¿Funciona esto también en Windows? – andrewrk

+11

Si trabaja en Windows, y si tiene un compilador, ¿por qué no solo lo ejecuta y ve? Háganos saber cómo va. –

+0

Aunque es ampliamente compatible (no conozco ningún compilador que no lo admita), no se garantiza el uso del argumento "envp" como main, solo "argc" y "argv". "envp" también lo convierte en local en main(). Una solución más portátil es observar el entorno externo (global) que proporcionan casi todos los compiladores, así como las funciones getenv() y setenv() que se supone que garantizan la integridad de la manipulación del entorno del proceso. . Muchas implementaciones también proporcionan una función putenv(), pero esta función puede no garantizar la integridad del entorno. (Consulte los documentos, se está quedando sin espacio para comentarios). –

4
int main(int argc, char* argv[], char* envp[]) { 
    // loop through envp to get all environments as "NAME=val" until you hit NULL. 
} 
14

Creo que deberías comprobar environ. Use "hombre medio".

+4

http://www.opengroup.org/onlinepubs/007908799/xsh/environ.html – ephemient

8

Su compilador puede proporcionar extensiones no estándar para la función principal que proporciona información variable de entorno adicional. El compilador de MS y la mayoría de las variantes de Unix tienen esta versión de principal:

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

donde el tercer parámetro es el entorno de información variable - utilizar un depurador para ver lo que el formato es - probablemente un nulo lista de punteros de cadena terminada.

1

Si está ejecutando un sistema operativo Windows, también puede llamar al GetEnvironmentStrings(), que devuelve un bloque de cadenas con terminación nula.

4

En la mayoría de los entornos, puede declarar su principal como:

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

envp contiene todas las cadenas de entorno.

37
#include<stdio.h> 

extern char **environ; 

int main() { 
    int i = 1; 
    char *s = *environ; 

    for (; s; i++) { 
    printf("%s\n", s); 
    s = *(environ+i); 
    } 

    return 0; 
} 
+1

Hay un error en su ejemplo. La primera var de entorno se imprime dos veces. –

+1

Usted es 100% correcto. He actualizado el valor inicial de i a 1 de 0. – user1602017

+2

La ventaja de esta solución es que no necesita estar en main(). Funciona bien si lo pones en medio de un programa grande y complicado. ¡¡Gracias!! –

5
int main(int argc, char **argv, char** env) { 
    while (*env) 
     printf("%s\n", *env++); 
    return 0; 
} 
Cuestiones relacionadas