본문 바로가기

Studying/Computer Programs

환경변수의 개념과 C/C++ 에서의 응용

여기서는 환경변수 (environment variable)의 개념과, 이를 C언어 또는 C++ 프로그램에서 사용하는 방법을 알아봅시다. 프로그램 외부에서 환경변수와 그 값들을 정의하고, 이를 프로그램에서 사용할 수 있도록 코드를 구성하면 편리합니다.

 

반응형

 

환경변수의 개념과 예시

환경변수란, 간단히 말해서 프로그램을 구동하는 프로세스들이 사용할 수 있도록 운영체제 레벨에서 정의된 변수들을 말합니다. 우리가 프로그램을 실행하면, 필요에 따라 여러 환경변수들에 저장된 값들을 가져다가 사용합니다.

 

좀 더 구체적인 예시를 통해 이를 살펴봅시다. 리눅스나 유닉스에서 가장 친숙한 환경변수 중의 하나는 PATH가 있는데요. 이는 터미널 콘솔에서 프로그램을 실행할 때, 쉘 (shell)이 PATH의 값으로부터 실행파일이 있는 디렉토리를 알아냅니다. 여기서 쉘은 터미널 콘솔에 입력된 명령어를 받아서 프로그램을 실행시키는 일종의 중재자로서, 현재 디렉토리에 있지 않은 실행파일을 사용할 수 있는 이유도 실행파일의 위치가 환경변수 PATH에 있기 때문이죠. 윈도우에서는 %PATH%라는 환경변수가 비슷한 역할을 합니다.

 

환경변수의 또 다른 예시로는 HOME이 있습니다. 이름에서 유추할 수 있듯이 리눅스 혹은 유닉스에서 홈디렉토리의 위치를 저장하고 있는 환경변수입니다. 만약 홈디렉토리에 다른 서브 디렉토리를 만들고 프로그램에다가 그 위치를 알려주고 싶을 때, HOME에 저장된 값으로부터의 상대적인 위치를 알려주면 편리합니다. 비슷한 역할을 하는 윈도우 환경변수로는 %HOMEPATH%가 있고, 이는 C:\Users\[사용자 이름] 에 해당됩니다.

 

환경변수들을 본격적으로 활용하기 위해서는 이들의 값을 확인하고 변경할 수 있어야겠죠. 리눅스와 유닉스의 경우 이를 위해서 echo 명령어를 사용합니다. 그리고 환경변수의 값을 알려주는 연산자인 달러 ($)표시를 이름 앞에 붙이면 되겠습니다. 예컨대 환경변수 PATH의 값을 알고싶다면, 터미널 콘솔에서 다음과 같이 실행하면 됩니다.

 

echo $PATH

 

환경변수의 값들을 정하는 방법을 짚어볼 차례인데요. 이 때는 쉘의 종류에 따라 다른 명령어를 사용해야 합니다. bash 쉘의 경우라면 export 명령어를 사용하고, TC 쉘에서는 setenv 명령어를 사용합니다. 예를 들어서 홈 디렉토리의 서브 디렉토리 foo/bin 에다가 실행파일을 넣어두고, 이것을 경로에 추가해주고 싶은 상황을 상정해 봅시다. 터미널 콘솔에서 다음과 같이 실행할 수 있습니다.

 

  • bash 쉘의 경우
      export PATH=${HOME}/foo/bin:$PATH
  • TC 쉘의 경우
      setenv PATH ${HOME}/foo/bin:$PATH

 

홈디렉토리에 대한 상대적인 위치를 알려주기 위해 환경변수 HOME을 사용한 것을 볼 수 있죠. 참고로 환경변수 이름에다가 중괄호 ({ })를 씌운 것은 환경변수 자체의 값과 별도로 추가해주는 부분을 분리하기 위함입니다. 그리고 PATH의 기존값을 콜론 (:) 뒤에다가 추가했는데요. 이는 쉘 프로그램이 환경변수 PATH를 이용하는 방식으로서, 콜론으로 구분된 여러 디렉토리들을 탐색하여 실행파일을 찾기 때문입니다.

 

터미널을 열 때마다 환경변수들에게 주어지는 기본값을 설정할 수도 있습니다. bash 쉘의 경우 홈디렉토리의 .bashrc 파일 (macOS 의 경우 .bash_profile 파일)을 열고, TC 쉘의 경우 .tcshrc 파일을 열어서 환경변수를 설정하기 위한 명령어를 텍스트로 추가해 주면 되겠습니다.

 

C언어 및 C++ 프로그램에 대해 이야기하기 전에, C/C++ 컴파일러가 사용하는 환경변수들에 대해서도 알아두면 좋습니다. 외부에서 다운로드 받은 프로그램이나 라이브러리를 개인용 컴퓨터에서 빌드하는 경우라면 별로 신경쓸 일이 없습니다만, 슈퍼컴퓨터를 사용하거나 할 때는 관리자 권한이 없어서 난감할 수 있죠. 이 때는 쓰기 권한이 있는 디렉토리에 라이브러리 등을 대신 설치해서 사용해야 되는데, 다음 환경변수들을 활용하면 큰 도움이 됩니다.

 

  • C_INCLUDE_PATH
    C언어 컴파일러가 헤더 파일을 탐색하는 디렉토리들이 저장되는 환경변수입니다. 여러 개의 디렉토리들을 포함하는 것이 가능하며, PATH의 경우와 마찬가지로 콜론 (:)으로 서로 다른 디렉토리를 구분합니다.
  • CPLUS_INCLUDE_PATH
    C++ 컴파일러를 위한 환경변수로서, C_INCLUDE_PATH와 비슷한 방식으로 C++ 헤더 파일들의 디렉토리를 알려주는 역할을 합니다.
  • LIBRARY_PATH
    정적, 동적 라이브러리 파일의 위치를 알려주기 위한 변수로서, 외부 라이브러리를 링크할 때 이 환경변수가 사용됩니다. 콜론 기호를 통해 여러 디렉토리를 추가할 수 있습니다.
  • LD_LIBRARY_PATH
    컴파일러가 직접 사용하지는 않지만, 동적 라이브러리를 사용하기 위해서는 이 환경변수를 지정할 필요가 있습니다. 라이브러리 파일의 위치를 실행 파일에게 알려줘야 하는데, 그 역할을 하는게 바로 LD_LIBRARY_PATH 입니다.

 

C언어나 C++ 로 작성된 소스 코드로부터 프로그램을 빌드하는 과정에서, 헤더 파일과 라이브러리가 어떻게 개입하는지에 대해서는 다음 포스팅에 더 자세하게 소개되어 있습니다.

 

 

C/C++ 코드가 프로그램이 되는 과정

여기서는 C언어 또는 C++로 작성된 소스 파일, 헤더 파일의 개념과 이들을 빌드하여 하나의 프로그램을 만드는 과정에 대해 간략하게 짚어보겠습니다. 여러 개의 소스, 헤더 파일들로 이루어진

swstar.tistory.com

 

C언어의 getenv 함수

C언어 또는 C++ 프로그램에서 환경변수의 값들을 이용하는 방법으로는 getenv 함수를 사용하는 것이 있는데요. 이 함수를 호출하기 위해서는 표준 라이브러리의 stdlib.h 헤더 파일을 포함시켜야 합니다. getenv는 환경변수의 이름을 인자로 받고, 값이 저장된 문자열의 메모리 주소를 리턴하는 함수로서, 다음과 같은 프로토타입을 가지고 있습니다.

 

/* 환경변수의 이름이 저장된 문자열의
 * 포인터를 매개변수로 받고,
 * 환경변수의 값이 저장된 문자열의
 * 포인터를 리턴 */
char *getenv(const char *env);

 

이제 간단한 예제 프로그램을 하나 만들어 봅시다.

 

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]) {
    char *ptr_env;
    ptr_env = getenv("FOO");

    fprintf(stdout,
            "FOO : %s\n",
            ptr_env);
    fprintf(stdout, "\n");

    return 0;
}

 

이 프로그램은 FOO라는 환경변수의 값을 받아서 이를 출력하는 기능을 가지고 있습니다. 환경변수의 값을 설정한 뒤에 프로그램을 실행해 보면 다음과 같은 결과를 얻을 수 있죠.

 

exacution of a sample program, which is using getenv function

 

환경변수의 값들은 문자열로 저장되기 때문에, 문자열을 다루는 함수들과 연계해서 사용해야 그 진가를 발휘할 수 있습니다. C언어에서 문자와 문자열을 사용하기 위한 자세한 방법이 궁금하시다면, 다음 포스팅이 큰 도움이 되리라 생각합니다.

 

 

C언어 문자와 문자열 사용하기

여기서는 C언어 프로그램에서 문자와 문자열을 다루는 방법에 대해 살펴보겠습니다. 컴퓨터는 이진수를 다루는 기계이지만, 인간에게 가장 친숙한 건 알파벳 같은 문자들이죠. 컴퓨터도 결국

swstar.tistory.com