프로세스 생성 함수 -------------------------------------------------------------------------------------------

윈도우에는 CreateProcess함수가 있다.

이 크리에이트 프로세스를 사용하여 프로세스를 생성하는 프로세스를 가리켜 부모 프로세스(Parent Process)라고 하고 이 함수를 통해서 생성된 프로세스를 자식 프로세스(Child Process)라고 한다.


함수의 원형을 살펴보자.

BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);

뭔가... 많다. 인자값을 한번 살펴보자.

------------------------

1. __in_opt LPCTSTR lpApplicationName,                  

-> 생성할 프로세스의 실행파일 이름을 인자로 전달.

------------------------

2. __inout_opt LPTSTR lpCommandLine,                    

-> main 함수에 있는 argc, argv라는 이름으로 문자열의 개수와 문자열이 전달된다. 1.번을 NULL로 했을경우 이곳에서 실행파일의 이름을 전달할 수도 있다. 이러한 경우 실행파일의 이름은 표준검색경로를 기준으로 찾게 된다.

------------------------

3. __in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,

-> 프로세스의 보안속성을 지정한다. NULL로 선언하면 Default속성으로 지정된다.

------------------------

4. __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,

-> 쓰레드의 보안속성을 지정할때 사용된다. NULL을 전달할 경우 Default속성으로 지정된다.

------------------------

5. __in BOOL bInheritHandles,

-> 전달인자가 TRUE인경우 생성되는 자식 프로세스는 부모프로세스가 소유한 핸들중 일부(상속가능한 녀석들)을 상속한다.

------------------------
6. __in DWORD dwCreationFlags,

-> 생성하는 프로세스의 특성(특히 우선순위)을 결정지을 때 사용되는 옵션이다. 일반적으로 0으로 설정한다.

------------------------
7. __in_opt LPVOID lpEnvironment,

-> 프로세스마다 Environment Block 라는 메모리 블록을 관리한다. 이블록을 통해서 프로세스가 실행에 필요로 하는 문자열을 저장할수 있다. NULL로 지정할 경우 자식프로세스는 부모프로세스의 환경 블록에 저장되어 있는 문자열을 복사하게 된다.

------------------------
8. __in_opt LPCTSTR lpCurrentDirectory,

-> 생성하는 프로세스의 현재 디렉토리를 설정한다. 인자는 디렉토리 정보를 포함하는 완전 경로 형태로 구성되어야 한다. NULL이 전달될 경우 부모프로세스의 현재 디렉토리가 새로 생성하는 자식 프로세스의 현재 디렉토리가 된다.

------------------------

9. __in LPSTARTUPINFO lpStartupInfo,

-> STARTUPINFO 구조체 변수를 초기화한 다음 이 변수의 포인터를 인자로 전달한다. STARTUPINFO내용은 추후 설명

------------------------

10. __out LPPROCESS_INFORMATION lpProcessInformation

-> 생성하는 프로세스 정보를 얻기 위해 사용되는 인자이다. PROCESS_INFORMATION구조체 변수의 주소값을 인자로 전달한다.

------------------------


현재디렉토리(Current Directory)? ------------------------------------------------------------------------------

#include <iostream> 같은 전처리 명령등에서 완전경로(c: 에서부터 지금 사용하려면 파일이나 폴더가 있는 경로를 모두 포함한 값)를 사용하지 않고 파일 참조가 가능했다.

현재디렉토리라는 개념은 일반적으로 실행하려는 프로그램의 실행파일이 존재하는 폴더를 의미한다.

DWORD GetCurrendtDirectory(DWORD nBufferLength, LPTSTR lpBuffer) 함수로 확인이 가능하다.

첫번째는 두번째 인자값의 무낮열 길이를 정보를 넣고 두번째 정보는 정보를 담을 문자열 포인터를 넣으면 된다.

현재 디렉토리는 BOOL CurrendtDirectory(LPCTSTR lpPathName) 함수로 선언이 가능하고 변경하길 원하는 디렉토리 경로명만 넣으면 된다.


Posted by JJOREG