2010-08-13 9 views

Respuesta

28

Eche un vistazo a la variable global environ.

extern char **environ; 

Se podría definirse en unistd.h (echar un vistazo a la página environ (5) hombre arriba).

He aquí una pequeña demostración de código que he escrito:

#include <stdio.h> 
extern char **environ; 

int main() 
{ 
    for (char **env = environ; *env; ++env) 
     printf("%s\n", *env); 
} 

Así es como se usa:

[email protected]:~/Desktop$ make enumenv CFLAGS=-std=c99 
cc -std=c99 enumenv.c -o enumenv 
[email protected]:~/Desktop$ ./enumenv 
ORBIT_SOCKETDIR=/tmp/orbit-matt 
SSH_AGENT_PID=1474 
TERM=xterm 
SHELL=/bin/bash 
... (so forth) 
+2

No está definido en unistd.h, o si lo es, su sistema no es compatible con POSIX. POSIX requiere que declare explícitamente 'extern char ** environ; 'si desea usarlo. –

+0

@R, +1. En mi sistema al menos, solo se declara en 'unistd.h' si' __USE_GNU' está configurado, lo que indica que es una extensión. (FWIW, '__environ', también una extensión, se declara incondicionalmente). –

+0

@R: Sí, lo hice en mi código de ejemplo. –

9

El entorno de la información se puede pasar como un parámetro adicional para principal. No sé si es compatible o no, pero definitivamente funciona (probado en Ubuntu). Simplemente defina el argumento adicional y es una matriz de punteros char terminados por un puntero NULL. Lo siguiente imprimirá el lote.

#include <stdio> 

int main(int argc, char *argv[], char *envp[]) 
{ 
    int index = 0; 
    while (envp[index]) 
    printf("%s\n", envp[index++]; 
} 
+0

+1: nunca escuché esto antes de – sje397

+1

En la práctica, esto funciona en la mayoría de los equipos, pero no está especificado por POSIX. Use 'extern char ** environ;'. –

+0

Cuando Jonathan respondió a uno de mis otros comentarios, a partir de POSIX 2008 * ahora * es parte de unistd.h. –

2

Hay una demostración en el libro "La interfaz de programación de Linux" en la página 127.

Listing 6-3: Viendo el entorno del proceso ------------ ------------------------------------ proc/display_env.c

#include "tlpi_hdr.h" 

extern char **environ; 

int 
main(int argc, char *argv[]) 
{ 
    char **ep; 
    for (ep = environ; *ep != NULL; ep++) 
     puts(*ep); 
    exit(EXIT_SUCCESS); 
} 
Cuestiones relacionadas