본문 바로가기

My Study/Programming&Theory

프로세스 환경변수

프로세스에서 환경변수를 이용하는 것에대해서 알아보겠습니다. 소개할 함수는 3가지입니다.
SetEnvironmentVariable : 프로세스 환경변수를 등록하는 함수
GetEnvironmentVariable : 등록한 환경변수를 참조할 때 사용하는 함수
GetEnvironmentStrings : 현재 프로세스의 환경변수블록의 포인터를 리턴
자세한 내용은 MSND을 보시면 자세히 나와있습니다.

먼저 프로세스에서 환경변수를 등록해 어떠한 환경변수들이 등록되어 있는지 확인하는 소스를 짜보겠습니다.

소스가 짧아서 설명할건 없습니다. 주석으로 대충 설명은 달아놨습니다.
이제 출력 결과를 보시겠습니다.

결과를 보시면 조금 이상한점이 있을 것입니다. 위 결과가 전부가 아니라 아래 엄청 많이 있습니다.
분명히 전 3개만 환경변수로 등록해놨는데 출력을 해보니 엄청 많은 환경변수가 출력 됬습니다. MSDN에서 해당 함수를 찾아서 다시 읽어보니 이런 부분이 있었습니다.

해당 함수를 호출한 프로세스의 환경변수를 포함한 메모리 블록의 주소를 리턴한다고 되어 있습니다. 
( 시스템, 유저 환경변수 둘다..~! )

제가 등록한 환경변수, 제 프로세스 관련된 환경변수를 포함해 모든 환경변수를 다 출력해 주는거 같군요.

그러면 이렇게 등록한 환경변수는 어떻게 사용할 수 있는 것일까요??
한 프로세스에서 다른 프로세스로 특정 값을 옮길 때 사용될 수도 있겠군요.

간단하게 실험을 해보겠습니다.
한 프로세스에서 자식 프로세스를 생성시켜서 자식프로세스에서는 부모프로세스의 환경변수에 있는 값을 참조해 출력을 하는 것입니다. 먼저 부모프로세스의 소스부터 보겠습니다.

환경변수를 그대로 등록시키고 자식프로세스를 하나 생성하고 있습니다.
설명은 주석으로 달아놨습니다. 이제 자식프로세스의 소스를 보시겠습니다.

GetEnviromentVariable함수로 환경변수에서 key에 대응하는 value값을 가져와 출력하는 프로그램입니다.

이제 부모프로세스를 실행시켜보겠습니다.

부모프로세스는 바로 끝나버렸고.. 자식프로세스가 생성됬습니다. 
출력 결과를 보니 제대로 값을 얻어온 것을 확인할 수 있었습니다.

이와 같이 프로세스간에 특정 값이나 문자열을 옮길 때 프로세스 환경변수를 사용해 옮기는 방법도 있다는 것 입니다.
이것은 올디로 봐도 뭐 없기 때문에 자세히 보진 않겠습니다. 
어짜피 특정 메모리를 할당해 거기에 환경변수를 등록하기 때문입니다.

말로만 잠깐 설명해보면 SetEnvironmentVariable함수를 호출 할 때마다 환경변수들이 있는 문자열 뒤에 추가되는 환경변수가붙는게 아니라 새로운 메모리 공간을 할당해 거기에 환경변수를 처음부터 끝까지 추가된 환경변수를 포함해 다 다시 등록한다는 것입니다.

거기서 GetEnvironmentStrings를 함수를 사용하게되면 마지막으로 호출된 SetEnvironmentVariable함수에 의해 생성된 메모리 공간 안에있는 환경변수의 주소를 리턴한다는 것입니다.

말로만 설명했지만 어려운 내용이 아니니 직접 확인해 보는 것도 좋은 방법입니다 ^^ 
컴퓨터라는 분야는 자기 눈으로 직접 보는게 가장 정확하기 때문이죠...~_~