윈도우즈 시스템 프로그래밍
윈도우즈 시스템 프로그래밍 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;
}