2013-05-27 1 views
6

C++로 프로그래밍 할 때 getenv으로 개별 환경 변수에 액세스 할 수 있다는 것을 알고 있습니다.c/C++ 앱에서 모든 환경 변수를 나열하는 방법

또한 os x 터미널에서 env을 사용하여 현재 환경 변수를 모두 나열 할 수 있음을 알고 있습니다.

나는 실행중인 C++ 프로그램에서 사용할 수있는 환경 변수의 전체 목록을 얻는 데 관심이 있습니다. c/C++ 함수가 나열되어 있습니까? 즉, 내 C++ 코드에서 env으로 전화하는 방법이 있습니까?

+2

마법 여기에 있습니다 : : 여기 env의 소형 클론의 [env.c] (http://minnie.tuhs.org/cgi-bin/utree.pl?file=OpenSolaris_b135/cmd/env/ env.c). – dasblinkenlight

+0

셸 명령은'ENV'가 아니라'env'입니다. (나는 당신의 질문을 수정했습니다.) –

답변

10

environ 전역 변수를 사용합니다. name=value 형식의 문자열 배열에 대한 널로 끝나는 포인터입니다.

#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

사실. 'man getenv'는 맨 아래 (OP가 언급 한 OS X에서)에'environ (7) '을 언급하는'SEE ALSO' 섹션을 가지고 있습니다. 그래서'man environ'은 이것을 설명하는 맨 페이지를 제공합니다. 'apropos environment'도이 페이지를 포함합니다. 이것은 RTFM을 의미하지는 않지만, OP에 맨 페이지의 'SEE ALSO'섹션이 확인할 가치가 있다는 힌트입니다. –

11

당신은 main에 비 휴대용 envp 인수를 사용할 수 있습니다 : 당신이 apple이 다른 OS는 정보 제공주는 분명히 OSX에 보너스

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

과 같이

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

하지만 무엇에 사용됩니까? 음, 애플은 사과 벡터를 사용하여 원하는 "숨겨진"매개 변수를 프로그램에 전달할 수 있습니다. 그리고 그들은 실제로 그것을 사용합니다. 현재 apple [0]에는 실행중인 바이너리가 디스크에서 발견 된 경로가 들어 있습니다. 네가하는 말은 뭐니? 사과 [0]은 argv [0]와 어떻게 다른가요? 차이점은 execve (2)가 호출되면 argv [0]을 임의의 값으로 설정할 수 있다는 것입니다. 예를 들어, 껍질은 종종 [0] 인 ARGV의 첫 번째 문자로 로그인 쉘을 시작하여 일반 쉘에서 로그인 쉘을 차별화 -

0

으악를, 나는 system 당신이 터미널 명령을 실행할 수 있음을 잊어 버렸습니다.

이 조각은 내가 필요한 걸 제공 :

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

변수가 프로그램에서 사용 가능하게 만들지는 않으며 표준 출력으로 출력합니다. –

관련 문제