2010-08-13 7 views

Odpowiedz

28

Spójrz na zmienną globalną environ.

extern char **environ; 

To może być zdefiniowana w unistd.h (spójrz na stronie environ (5) człowieka powyżej).

Oto mały kod demo pisałem:

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

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

Oto jak go używać:

[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

Nie zdefiniowano w unistd.h, lub jeśli jest, twój system nie jest zgodny z POSIX. POSIX wymaga jawnego zadeklarowania 'zewnętrznego char ** environ;' jeśli chcesz go użyć. –

+0

@R, +1. W moim systemie jest ono deklarowane tylko w 'unistd.h', jeśli ustawione jest' __USE_GNU', co oznacza, że ​​jest rozszerzeniem. (FWIW, '__environ', również rozszerzenie, jest zadeklarowane bezwarunkowo). –

+0

@R: Tak, zrobiłem to w moim przykładowym kodzie. –

9

Środowisko informacje mogą być przekazywane jako dodatkowy parametr do głównej. Nie wiem, czy jest zgodny, czy nie, ale na pewno działa (testowany na Ubuntu). Po prostu zdefiniuj dodatkowy argument i jego tablicę wskaźników znakowych zakończoną wskaźnikiem NULL. Poniższe wydrukują całą partię.

#include <stdio> 

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

+1: nie słyszałem o tym przed – sje397

+1

W praktyce działa to na większości unice, ale nie jest określone przez POSIX. Użyj 'zewnętrznego char ** environ;'. –

+0

Jak Jonathan odpowiedział na jeden z moich innych komentarzy, od POSIX 2008 to * jest * teraz częścią unistd.h. –

2

Jest demo w książce "Programming Interface Linux" na stronie 127.

listingu 6-3: Wyświetlanie środowisko procesu ------------ ------------------------------------ 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); 
}