[리눅스 시스템 프로그래밍] 7.3 환경 변수, getenv, putenv 함수

이미 앞에서 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;
}
[그림 7.4] ex_envp 실행 화면
[그림 7.4] ex_envp 실행 화면

 그런데 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;
}
[그림 7.5] ex_getenv 실행 화면
[그림 7.5] ex_getenv 실행 화면

 다음은 명령행 인자의 두 번째 인자가 키인 환경 변수가 있다면 세 번째 인자로 값을 설정하고 없다며 환경 변수 목록에 추가하는 예제 코드입니다.

/**********************************************************************
* 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;
}
[그림 7.6] ex_putenv 실행 화면
[그림 7.6] ex_putenv 실행 화면