Czy istnieje sposób na wyliczenie zmiennych środowiskowych i pobranie wartości za pomocą C?Wyświetlenie zmiennych środowiskowych za pomocą C w systemie UNIX
Odpowiedz
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)
Ś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++];
}
+1: nie słyszałem o tym przed – sje397
W praktyce działa to na większości unice, ale nie jest określone przez POSIX. Użyj 'zewnętrznego char ** environ;'. –
Jak Jonathan odpowiedział na jeden z moich innych komentarzy, od POSIX 2008 to * jest * teraz częścią unistd.h. –
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);
}
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ć. –
@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). –
@R: Tak, zrobiłem to w moim przykładowym kodzie. –