환경변수에 관하여
putenv, setenv, unsetenv등 합수로 환경변수를 개변하여도 environ이 가리키는 원 환경변수는 변하지 않는다고 알고있습니다
그런데 이상한 일이 발생하는 군요, 무슨 영문인지 몰라서 지도를 바랍니다
아래의 코드에서 comment한 부분이 있을때와 없을때 전혀 다른 결과가 나옵니다
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
int main(int argc, const char **argv, const char **envp)
{
/*
while(*environ)
puts(*environ++);
puts("\n----------------------\n");
*/
printf("HOME=%s\n", getenv("HOME"));
putenv("HOME=/usr/kingsoho");
printf("HOME=%s\n", getenv("HOME"));
setenv("HOME", "/usr/bluesoho/kim", 1);
printf("HOME=%s\n", getenv("HOME"));
unsetenv("HOME");
if(!getenv("HOME"))
puts("HOME has been deleted");
printf("\n--------------------------------\n");
while(*envp)
puts(*envp++);
return 0;
}
comment한 부분이 외부변수 environ 값을 바꾸네요. 당연히 어
comment한 부분이 외부변수 environ 값을 바꾸네요. 당연히 어떤 side effect가 있겠죠?
[code:1]while(*environ) puts&#
에서 환경변수의 포인트를 증가 시켜 두고 다시 복원을 하지 않아서 발생하는 문제 입니다. ;
정도로 하시던지..
이렇게 해주셔야 할 것 같으네요.
>>>행복한 웃음<<<
cdpark 님의 글에 첨언하자면..environ 과 envp는
cdpark 님의 글에 첨언하자면..
environ 과 envp는 동일한 주소를 가지고 있는 포인터입니다.(아시겠지만...)
하지만 getenv와 setenv, unsetenv는 모두 environ 변수의 주소값과 관련이 깊은 함수들입니다.
environ 변수의 주소값에서부터 인자로 넘어가는 환경변수를 찾으려고 하는거죠.
comment 하신 부분에서 environ이 담고있는 주소값을 변경시켰기 때문에 발생하는 문제입니다.
while(*environ)
puts(*environ++);
puts("\n----------------------\n");
부분 다음에
environ = (char **)envp;
를 해준다음 프로그램을 수행하시면 동일한 결과가 나타남을 보실 수 있으실 겁니다.
setenv, putenv, unsetenv등함수를 수행한후 envir
setenv, putenv, unsetenv등함수를 수행한후 environ이 가리키는 환경변수도 따라서 변하는 겁니까?
[code:1]setenv, putenv, unsetenv등함수를 수행한
setenv, putenv, unsetenv등함수를 수행한후 environ이 가리키는 환경변수도 따라서 변하는 겁니까?
environ이라는 변수는 unistd.h인가에 선언 되어 있습니다.
이 변수의 역할은 현재 실행되는 프로그램의 환경변수들을 저장 하는
역할을 합니다.
위의 환경 변수 관련 함수들을 호출 하게 되면, environ이라는 변수에서
환경변수를 하나 추가, 삭제, 변경의 기능을 하게 됩니다.
environ이라는 변수에 저장되어 있는 값이 변경 된다는 것은 현재 실행중에
있는 프로그램이 참조 하는 환경변수의 값이 변경된다는 말과 같습니다.
>>>행복한 웃음<<<
[code:1]char ** lenv; lenv=environ
라고 해야 조금 더 안전하겠죠?
고맙습니다. ^_^
고맙습니다. ^_^
댓글 달기