이미 앞에서 main 함수의 세 번째 입력 매개변수는 환경 변수 목록이라는 것을 얘기했었죠.
int main(int argc, char **argv, char **envp);
argc – 명령행 인자 개수
argv – 명령행 인자 벡터
envp – 환경 변수 목록
환경 변수 목록의 각 항목은 키와 값으로 구성하고 =로 구분합니다. env[0]값이 “HOME=/home/ehpub” 라면 HOME은 키, /home/ehpub는 값입니다.
환경 변수 목록에 마직막 항목 뒤에는 NULL값을 갖고 있습니다. 다음은 main 함수의 세 번째 입력 매개변수를 이용하여 환경 변수 목록을 확인하는 예제 코드입니다.
/********************************************************************** * ex_envp.c * * exmple source – print enviroment list * **********************************************************************/ #include <stdio.h> int main(int argc, char **argv,char **envp) { int i = 0; printf("=== environment list ===\n"); for(i=0; envp[i];i++) { printf("<%2d>: %s\n", i, envp[i]); } return 0; }
그런데 C 프로그램에서는 environ이라는 전역 변수가 미리 만들어져 있으며 이를 통해 환경 변수 목록을 확인할 수 있어요. 다른 곳에서 미리 선언한 상태이므로 extern 문으로 environ 변수를 참조하면 환경 변수 목록을 확인할 수 있어요. 다음은 environ 변수를 참조하여 환경 변수 목록을 확인하는 예제 코드입니다.
/********************************************************************** * ex_environ.c * * exmple source – print enviroment list using environ variable * **********************************************************************/ #include <stdio.h> extern char **environ; int main() { int i = 0; printf("=== environment list ===\n"); for(i=0; environ[i];i++) { printf("<%2d>: %s\n", i, environ[i]); } return 0; }
C언어에서는 환경 변수에 목록에 항목을 추가하는 putenv, 확인하는 getenv 함수와 값을 설정하는 setenv 함수를 제공하고 있어요.
#include <stdlib.h >
char *getenv(const char *key);
int putenv(char *entry);
int setenv(const char *key, const char *value, int rewrite);
rewrite – 이미 같은 key 항목이 있을 때 새로운 값으로 수정할 지 여부
putenv 함수는 키 값을 전달하면 value를 반환합니다. 만약 존재하지 않는다면 NULL을 반환합니다. 다음은 원하는 항목의 키를 명령행 인자로 전달받아 해당 항목의 값을 출력하는 예제 코드입니다.
/********************************************************************** * ex_getenv.c * * exmple source – find environment element by key * **********************************************************************/ #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { if(argc != 2) { printf("Usage: %s <environment key> \n", argv[0]); return 1; } char *env = getenv(argv[1]); if(env) { printf("%s's value is %s\n",argv[1], env); } else { printf("%s is not existed\n",argv[1]); } return 0; }
다음은 명령행 인자의 두 번째 인자가 키인 환경 변수가 있다면 세 번째 인자로 값을 설정하고 없다며 환경 변수 목록에 추가하는 예제 코드입니다.
/********************************************************************** * ex_putenv.c * * exmple source – print enviroment list * **********************************************************************/ #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv,char **envp) { if(argc != 3) { printf("Usage: %s <key> <value> \n",argv[0]); return 1; } char *env = getenv(argv[1]); if(env) { printf("old %s's key is %s\n",argv[1], env); setenv(argv[1], argv[2], 1); } else { printf("%s's key is not existed\n", argv[1]); char buf[256]=""; sprintf(buf, "%s=%s", argv[1], argv[2]); putenv(buf); } printf("after...\n"); env = getenv(argv[1]); printf("%s's key is %s\n", argv[1], env); return 0; }