728x90
반응형
C언어 환경 변수 관리: getenv, setenv, putenv 완벽 가이드
운영체제(OS)에는 프로그램 실행에 필요한 정보를 담은 환경 변수(Environment Variable)가 존재합니다. C언어 개발 시 PATH 경로를 확인하거나, 특정 설정값을 시스템으로부터 읽어와야 할 때 표준 라이브러리 함수를 사용하게 됩니다.
오늘은 환경 변수를 조회, 추가, 수정, 삭제하는 4가지 핵심 함수와 실무에서 반드시 주의해야 할 메모리 이슈를 정리해 보겠습니다.

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. 실무 개발자 팁: 환경 변수 조작의 한계
- 영향 범위(Scope): C 프로그램 내부에서 변경한 환경 변수는 해당 프로세스와 그 자식 프로세스에만 영향을 미칩니다. 프로그램을 종료한 후 터미널(Shell)의 환경 변수가 바뀌어 있지는 않습니다.
- 메모리 누수: putenv를 반복 호출하면서 malloc으로 할당된 문자열을 넘길 경우, 이전 데이터의 메모리 해제 시점이 모호해질 수 있습니다. 가급적 setenv 사용을 권장합니다.
요약 테이블
| 함수 | 역할 | 특징 |
| getenv | 조회 | 존재하지 않으면 NULL 반환 |
| setenv | 설정/수정 | 값 복사를 통해 안전하게 설정 |
| putenv | 추가/변경 | 문자열 포인터를 직접 연결 (주의!) |
| unsetenv | 삭제 | 환경 테이블에서 해당 키 제거 |
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!
임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
반응형
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 종료 처리 완벽 가이드: atexit와 quick_exit 차이점 및 활용법 (0) | 2025.02.26 |
|---|---|
| C언어 system, exit, abort 함수 완벽 정리: 차이점과 실무 사용법 (0) | 2025.02.25 |
| C언어 시간 포맷팅 완벽 가이드: strftime, localtime, gmtime 활용법 (0) | 2025.02.23 |
| C언어 시간 함수 총정리: time, clock, difftime 사용법과 실행 시간 측정 (0) | 2025.02.22 |
| C언어 절댓값, 올림, 내림, 반올림 함수 완벽 정리 (abs, fabs, ceil, floor) (0) | 2025.02.21 |