윈도우즈 시스템 프로그래밍

윈도우즈 시스템 프로그래밍 8장 - 프로세스 환경변수

111-000-111 2021. 7. 29. 20:36

 

 

 

윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.

 

 

 


 

 

 

앞의 메일슬롯 예제에서 자식 프로세스에 핸들 정보를 전달하기 위해서 파일을 이용했는데, 이는 안정적이지 못한 방식이므로 프로세스 생성 시 main 함수의 매개변수를 활용하는 편이 훨씬 안정적이다.

여기에 또 다른 방법 한가지로 프로세스의 환경변수를 활용하는 방법이 있다.

 

환경변수는 프로세스별로 별도의 메모리 공간에 문자열 데이터를 저장하고 관리할 수 있도록 되어 있다.

 

환경변수는 key = value 와 같은 구조를 가지고 있다.

 

둘 이상의 데이터를 관리하기가 좋고, 부모 프로세스는 자식 프로세스 생성 시, 자식 프로세스의 환경변수를 등록할 수도 있고, 그냥 부모 프로세스의 환경변수를 상속 시킬 수도 있다.

 

 

 

 

SetEnvironmentVariable

 

프로세스 환경변수를 등록할 때 사용하는 함수

BOOL SetEnvironmentVariable (
    LPCTSTR lpName,
    LPCTSTR lpValue
);
// If the function fails, the return value is zero.

 

lpName : key에 해당하는 값을 지정한다. 이후에 key를 통해서 value 값을 참조하게 된다.
lpValue : value에 해당하는 값을 지정한다.

 

 

 

⦁ GetEnvironmentVariable

 

등록한 환경변수를 참조할 때 사용하는 함수이다.

 

 

DWORD GetEnvrionmentVariable (
    LPCTSTR lpName,
    LPTSTR lpBuffer,
    DWORD nSize
);
// If the function fails, the return value is zero.

 

⦁ lpName : key를 전달한다. key에 해당하는 value를 얻게 된다.
⦁ lpBuffer : value 값을 저장하기 위한 메모리의 주소를 지정한다.
⦁ nSize : lpBuffer가 가리키는 메모리의 크기를 지정한다.

 

이 함수는 성공시에 lpBuffer에 저장된 문자열의 길이를 반환한다.

 

 

 

 

 

프로세스 환경변수 예제

 

 

부모 프로세스가 자신의 환경변수를 등록하고, 자식 프로세스에게 상속시켜서 자식 프롤세스가 값을 확인하는 예제이다.

 

 

⦁ EnvParent.cpp

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	SetEnvironmentVariable(_T("Good"), _T("morning"));
	SetEnvironmentVariable(_T("Hey"), _T("Ho!"));
	SetEnvironmentVariable(_T("Big"), _T("Boy"));

	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi = { 0, };
	si.cb = sizeof(si);

	CreateProcess(NULL, _T("EnvChild"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi);

	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);
	return 0;
}

 

 

 

 

⦁ EnvChild.cpp

#include <stdio.h>
#include <tchar.h>
#include <windows.h>

#define BUFSIZE 1024

int _tmain(int argc, TCHAR* argv[])
{
	TCHAR value[BUFSIZE];

	if (GetEnvironmentVariable(_T("Good"), value, BUFSIZE) > 0)
		_tprintf(_T("[%s = %s] \n"), _T("Good"), value);

	if (GetEnvironmentVariable(_T("Hey"), value, BUFSIZE) > 0)
		_tprintf(_T("[%s = %s] \n"), _T("Hey"), value);

	if (GetEnvironmentVariable(_T("Big"), value, BUFSIZE) > 0)
		_tprintf(_T("[%s = %s] \n"), _T("Big"), value);

	Sleep(10000);
	return 0;
}