Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- list
- html
- 아두이노 컴파일러
- arduino compiler
- c++
- set
- 시스템프로그래밍
- 통계학
- queue
- map
- 아두이노
- 수광 소자
- Array
- LineTracer
- Algorithm
- 아두이노 소스
- 자료구조
- 컴퓨터 그래픽스
- stl
- WinAPI
- 운영체제
- directx
- Stack
- Visual Micro
- Deque
- C언어
- priority_queue
- Arduino
- 라인트레이서
- vector
Archives
- Today
- Total
Kim's Programming
프로세스(Process) - CreateProcess 본문
프로세스의 생성
물론 프로세스 생성은 아무 파일이나 마우스로 집어다가 더블클릭하면 프로세스를 생성할 수 있습니다. 하지만 또 다른 방법으로도 프로세스를 생성할 수 있습니다. 프로그램실행중에 또 하나의 프로세스를 생성하는 것입니다. 윈도우즈에서는 프로세스를 만들기 위해서 CreateProcess함수를 제공합니다. CreateProcess함수를 호출하는 하는 프로세스를 부모프로세스(Parents Process)라고 하고 CreateProcess로 만들어진 프로세스를 자식프로세스(Child Process)라고 합니다. 생성하는 프로세스와 생성되는 프로세스는 부모 자식관계를 가지게 됩니다.
CreateProcess은 다음과 같은 파라메터 들을 가지고 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | BOOL CreateProcess( LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); | cs |
각 파마메터들에 대해서 알아보겠습니다.
- lpApplicationName : 생성한 프로세스의 실행파일 이름을 인자로 전달합니다. 경로명을 추가로 지정할 수 있으며 경로명을 지정하지 않을 경우에는 프로그램의 현재 디렉터리에서 찾게 됩니다. 현재 디렉토리에서 찾길 원하면 NULL값을 지정해 줍니다.
- lpCommandLine : main 함수에 argc, argv라는 이름으로 전달되는 것 처럼 프로세스에 인자를 전달할 때 이용합니다. 또는 첫 번째 인자에 NULL을 준다음 이 두 번째 인자에 실행파일의 이름을 더불어 전달할 수도 있습니다. 이 경우엔 실행파일의 이름은 표준 검색경로 기준으로 찾게됩니다.
- lpProcessAttribute : 프로세스의 보안 속성을 지정할 때 사용하며 NULL을 전달할 경우 디폴트 보안 속성이 지정됩니다.
- lpThreadAttribute : 쓰레드의 보안 속성을 지정할 때 사용하게 됩니다. NULL을 전달할 경우 디폴트 보안 속성을 적용합니다.
- hInheritHandle : 전달인자가 TRUE일 경우, 생성되는 자식 프로세스는 부모 프로세스가 소유하는 handle중 일부를 상속합니다.
- dwCreationFlag : 생성하는 프로세스의 특성(특히 우선순위)를 결정지을 때 사용하는 옵션입니다. 설정 하지 않을 때는 0을 전달합니다.
- lpEnvironment : 프로세스마다 Environment Block이라는 메모리 블록을 관리합니다. 이 블록을 이용 프로세스가 실행시 필요로 하는 문자열을 저장할 수 있습니다. 이 전달인자를 통해서 생성하는 Environment Block을 지정합니다. NULL을 던달하면 자식 프로세스는 부모 프로세스의 환경 블록에 저장되어 있는 문자열을 복사하게 됩니다.
- lpCurrentDirectory : 생성하는 프로세스의 현재 디렉토리를 설정하는 인자입니다. 전달인자는 디렉터리 정보를 포함하는 완전경로로 구성해야하며 NULL전달시 부모프로세스의 디렉터리를 현재 디렉터리로 합니다.
- lpStartInfo : STARTUPINFO 구조체 변수를 초기화 한다음에 이 변수의 포인터를 인수로 전달합니다.
- lpProcessInformation : 생성하는 프로세스 정보를 얻기위해 사용되는 인자입니다. PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달합니다.
프로세스 생성 예제를 하나 만들어보겠습니다.
부모 프로세스
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<Windows.h> #include<tchar.h> #include<stdio.h> int _tmain(INT argc, TCHAR *argv[]) { STARTUPINFO SI={0, }; SI.cb = sizeof(SI); SI.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE; SI.dwX = 200; SI.dwY = 300; SI.dwXSize = 100; SI.dwYSize = 100; SI.lpTitle = _T("Child Process"); PROCESS_INFORMATION PI; TCHAR CommandLine[] = _T("Child.exe"); BOOL State; State = CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &SI, &PI); if (State == NULL) { _tprintf(_T("Fail to Create Process\n")); return -1; } else _tprintf(_T("Success to Create Process\n")); getchar(); return 0; } | cs |
자식 프로세스
1 2 3 4 5 6 7 8 9 10 | #include<Windows.h> #include<tchar.h> #include<stdio.h> int _tmain(INT argc, TCHAR *argv[]) { _tprintf(_T("This is Child Process")); getchar(); return 0; } | cs |
각 소스를 이용하여 만들면 프로세스를 만들 수 있습니다. 자식 프로세스용 프로그램은 Child.exe로 이름을 지정하여 주고 부모 프로세스 프로그램은 임의로 해도 상관이 없습니다. 프로세스를 생성하는 것의 결과는 다음과 같습니다.
또한 작업관리자를 통해서도 확인을 할 수 있습니다.
프로세스 만드는 과정
- STARTUPINFO 구조체 초기화
우선 STARTUPINFO 구조체를 살펴보겠습니다.
사용한 것들만 보겠습니다
각 구조체에서 사용한 것들은 다음의 의미들을 가지고 있습니다.
cb : 구조체의 변수의 크기
lpTitle : 콘솔 윈도우의 타이틀 바 제목
dwX : 프로세스 윈도우의 x 좌표
dxY: 프로세스 윈도우의 y 좌표
dwXSize : 프로세스 윈도우의 가로 길이
dwYSize : 프로세스 윈도우의 세로 길이
dwFlags : 설정된 멤버의 정보 - CreateProcess 함수 호출
2번째 인자를 줄때는 꼭 따로 변수를 선언해서 넣어줘야 합니다. 특히 유니코드에서는요 그렇지 않으면 들어가지 않게 됩니다. 나머지는 위와 같습니다.
'Programming > System Programming' 카테고리의 다른 글
커널 오브젝트 그리고 Usage Count (0) | 2016.01.01 |
---|---|
구조적 예외처리 - SEH(Structured Exception Handling) (0) | 2015.12.30 |
파일처리함수(2/2) (0) | 2015.12.25 |
파일처리함수(1/2) (0) | 2015.12.24 |
커널 오브젝트(Kernel Object) (0) | 2015.12.23 |