관리 메뉴

Kim's Programming

프로세스의 생성 본문

Programming/System Programming

프로세스의 생성

Programmer. 2017. 6. 24. 18:23

프로세스의 생성


CreateProcess 함수

1
2
3
4
5
6
7
8
9
10
11
12
BOOL CreateProcess(
    LPCSTR lpApplicationName,                                //1
    LPSTR lpCommandLine,                                    //2
    LPSECURITY_ATTRIBUTES lpProcessAttributes,        //3
    LPSECURITY_ATTRIBUTES lpThreadAttributes,        //4
    BOOL bInheritHandles,                                    //5
    DWORD dwCreationFlags,                                //6
    LPVOID lpEnvironment,                                    //7
    LPCSTR lpCurrentDirectory,                                //8
    LPSTARTUPINFOA lpStartupInfo,                        //9
    LPPROCESS_INFORMATION lpProcessInformation    //10
);
cs


인자 별 의미

    1. 생성할 프로세스의 실행파일 이름을 인자로 전달한다. 경로명 지정하지 않으면 현재 디렉터리에서 찾는다.
    2. 실행파일에 전달할 argc, argv 인자를 전달할때 쓴다. 첫번째에 NULL을 전달하고 두번째에 실행파일 이름도 전달할 수 있다.
    3. 프로세스의 보안속성 지정한다. NULL 지정시 기본 보안 속성
    4. 스레드의 보안 속성을 지정할 때 사용한다. NULL 지정시 기본 보안 속성
    5. 전달인자가 TRUE인 경우 생성되는 자식 프로세스는 부모 프로세스가 소유하는 핸들중 상속 가능한 핸들을 상속한다.
    6. 생성하는 프로세스의 특성을 결정지을때 사용(우선순위 등), 설정할 필요 없을 때는 0을 지정
    7. 프로세스마다 Environment Block(환경 블록)이라는 메모리 블록을 관리한다. 이 블록을 통해서 프로세스가 실행에 필요로 하는 문자열을 저장할 수 있다.NULL이 전달되면, 자식 프로세스는 부모 프로세스의 환경 블록에 저장되어 있는 문자열을 복사하게 된다.
    8. 생성하는 프로세스의 현재 디렉터리를 설정하는 인자, 전달인자는 디렉터리 정보를 포함하는 완전경로 형태로 구성하며, NULL이 전달될 경우 부모 프로세스의 현제 디렉터리가 새로 생성되는 자식 프로세스의 현재 디렉터리가 된다. 일반적으로 NULL
    9. 프로세스 속성을 지정하는 STARTUPINFO 구조체 변수를 전달한다. 
    10. 생성하는 프로세스 정보를 얻기 위해 사용되는 PROCESS_INFORMATION 구조체를 전달하는 인자이다.


* 자식 프로세스


1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
#include<tchar.h>
#include<Windows.h>
 
INT _tamin(int argc, TCHAR* argv[])
{
    DWORD val1 = _ttoi(argv[1]);
    DWORD val2 = _ttoi(argv[2]);
 
    std::wcout << val1 << _T(" + "<< val2 << _T(" = "<< val1 + val2 << std::endl;
    _gettchar();
    return 0;
}
cs


* 부모 프로세스


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
32
33
34
35
36
#include<iostream>
#include<tchar.h>
#include<Windows.h>
 
#define DIR_LEN MAX_PATH + 1
 
INT _tmain(INT argc, TCHAR* argv[])
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;
    si.dwX = 100;
    si.dwY = 200;
    si.dwXSize = 300;
    si.dwYSize = 200;
    si.lpTitle = _T("Child Process");
 
    TCHAR commandLine[] = _T("Child.exe 10 20");
    TCHAR cDir[DIR_LEN];
    BOOL state;
 
    GetCurrentDirectory(DIR_LEN, cDir);
    std::wcout << cDir << std::endl;
 
    state = CreateProcess(NULL, commandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
 
    if (state)
        std::wcout << _T("Creation OK!"<< std::endl;
    else
        std::wcout << _T("Creation Error!"<< std::endl;
 
    return 0;
}
cs



결과)




프로세스 생성 단계

      1. STARTUPINFO 구조체 변수의 생성하고 초기화 한다
      2. (현재 디렉토리를 설정한다.(자식프로세스가 있는 위치))
      3. CreateProcess 함수를 호출한다.