Core Programming/C Standard Library: Resource & Performan

C언어 환경 변수 완벽 가이드: getenv, setenv, putenv 차이점과 예제

임베디드 친구 2025. 2. 24. 12:27
728x90
반응형

C언어 환경 변수 관리: getenv, setenv, putenv 완벽 가이드

운영체제(OS)에는 프로그램 실행에 필요한 정보를 담은 환경 변수(Environment Variable)가 존재합니다. C언어 개발 시 PATH 경로를 확인하거나, 특정 설정값을 시스템으로부터 읽어와야 할 때 표준 라이브러리 함수를 사용하게 됩니다.

오늘은 환경 변수를 조회, 추가, 수정, 삭제하는 4가지 핵심 함수와 실무에서 반드시 주의해야 할 메모리 이슈를 정리해 보겠습니다.

Generated by Gemini AI.


1. 환경 변수란 무엇인가?

환경 변수는 운영체제가 프로세스에 전달하는 전역적인 설정 정보입니다.

  • PATH: 실행 파일을 찾는 경로
  • HOME: 사용자의 홈 디렉터리
  • USER: 현재 접속 중인 사용자 이름

C언어에서는 <stdlib.h> 헤더를 통해 이 값들을 자유롭게 다룰 수 있습니다.


2. 환경 변수 조회: getenv()

특정 환경 변수의 이름을 키(Key)로 전달하여 그 값을 가져옵니다.

  • 함수 원형: char *getenv(const char *name);
  • 주의: 변수가 존재하지 않으면 NULL을 반환하므로 반드시 예외 처리가 필요합니다.
C
 
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *user = getenv("USER");
    if (user != NULL) {
        printf("현재 사용자: %s\n", user);
    } else {
        printf("사용자 정보를 가져올 수 없습니다.\n");
    }
    return 0;
}

3. 환경 변수 설정: setenv() vs putenv()

두 함수 모두 환경 변수를 추가하거나 수정하지만, 메모리 관리 방식에 결정적인 차이가 있습니다.

3.1 setenv (권장 방식)

복사본을 만들어 저장하기 때문에 안전합니다.

  • int setenv(const char *name, const char *value, int overwrite);
  • overwrite: 1이면 기존 값을 덮어쓰고, 0이면 무시합니다.

3.2 putenv (주의 필요)

전달된 문자열 포인터를 그대로 환경 테이블에 연결합니다.

  • int putenv(char *string);
  • 위험성: 지역 변수(배열)를 putenv에 넘기면, 함수가 종료된 후 해당 메모리가 사라져 프로그램이 죽을 수 있습니다.
C
 
// 안전한 setenv 사용 예시
setenv("MY_APP_MODE", "DEBUG", 1);

4. 환경 변수 삭제: unsetenv()

더 이상 필요 없는 환경 변수를 제거합니다.

  • 함수 원형: int unsetenv(const char *name);
C
 
unsetenv("MY_APP_MODE");
if (getenv("MY_APP_MODE") == NULL) {
    printf("성공적으로 삭제되었습니다.\n");
}

5. 모든 환경 변수 리스트 출력 (environ)

시스템에 설정된 모든 환경 변수를 한눈에 확인하고 싶을 때는 environ 전역 변수를 사용합니다.

C
 
#include <stdio.h>

extern char **environ; // 외부 전역 변수 선언

int main() {
    for (char **env = environ; *env != NULL; env++) {
        printf("%s\n", *env);
    }
    return 0;
}

6. 실무 개발자 팁: 환경 변수 조작의 한계

  1. 영향 범위(Scope): C 프로그램 내부에서 변경한 환경 변수는 해당 프로세스와 그 자식 프로세스에만 영향을 미칩니다. 프로그램을 종료한 후 터미널(Shell)의 환경 변수가 바뀌어 있지는 않습니다.
  2. 메모리 누수: putenv를 반복 호출하면서 malloc으로 할당된 문자열을 넘길 경우, 이전 데이터의 메모리 해제 시점이 모호해질 수 있습니다. 가급적 setenv 사용을 권장합니다.

요약 테이블

함수 역할 특징
getenv 조회 존재하지 않으면 NULL 반환
setenv 설정/수정 값 복사를 통해 안전하게 설정
putenv 추가/변경 문자열 포인터를 직접 연결 (주의!)
unsetenv 삭제 환경 테이블에서 해당 키 제거

 


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형