본문 바로가기

High Level Technique/Window System

프로세스 환경변수

프로세스 환경변수


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

마치 python에서 dictionary 방식? 이라고 생각하면 쉬울 것 같습니다.



EnvParent.cpp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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);
    TCHAR command[] = _T("EnvChild");
 
    int result = CreateProcess(NULL, command, NULLNULL, FALSE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULLNULL&si, &pi);
 
    if (result == 0)
    {
        printf("%d", GetLastError());
    }
 
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    return 0;
}
cs




EnvChild.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#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;
}
cs



책에서는 EnvParent.cpp 16라인에서 command 대신에 바로 문자열을 넣어주고 있는데 책의 예제로 따라하면 에러가 발생합니다. 이유를 찾아보니 만약 notepad.exe를 실행하는데 CreateProcess로 실행시킬 경우 뒤에 추가로 텍스트 파일의 이름을 인자로 넘길 수 있는데 이러한 것을 내부적으로 파싱해서 처리하는데 문자열 상수의 포인터를 가지고 파싱을 시도하면 메모리 엑세스 에러가 난다고 합니다.


출처: http://beautyrain.tistory.com/10


따라서 TCHAR 배열로 만들어서 실행하면 정상적으로 실행이 됩니다.



'High Level Technique > Window System' 카테고리의 다른 글

쓰레드 (Thread)  (0) 2017.01.02
우선순위 알고리즘  (0) 2017.01.02
Anonymouse Pipe, Named Pipe  (0) 2016.12.30
Pseudo Handle, Handle Duplicate  (0) 2016.12.28
핸들 테이블과 오브젝트 핸들의 상속  (0) 2016.12.28