Pw4ngC0 2020. 6. 8. 22:17
728x90

프로그램 실행중에 또하나의 프로세스를 생성할 수 있다.

 

Create Process 함수의 이해

프로세스 생성을 위해 Create Process 함수를 제공한다. 이때 Create Process 함수를 호출하는 프로세스를 부모 프로세스(Parent Process)라 하고, Create Process함수 호출에 의해 생성된 프로세스를 가리켜 자식 프로세스(Child Process)라고 한다. 만약에 자식 프로세스가 Create Process 함수 호출을 통해 자식 프로세스를 생성하면, 그 사이에서도 부모 자식 관계는 형성된다.

 

Create Process 선언

BOOL CreateProcess(

   LPSTR lpApplicationName,

   LPSTR lpCommandLine,

   LPSECURITY_ATTRIBUTES lpProcessAttributes,

   LPSECURITY_ATTRIBUTES lpThreadAttributes,

   BOOL bInheritHandles,

   DWORD dwCreationFlags,

   LPVOID lpEnvironment,

   LPCTSTR lpCurrentDirectory,

   LPSTARTUPINFO lpStartupInfo,

   LPPROCESS_INFORMATION lpProcess_Information

);

 

lpApplicationName : 생성할 프로세스의 실행 파일 이름을 인자로 전달한다. 경로명을 지정할 수 있고, 경로명을 지정하지 않을 경우 프로그램의 현재 디렉터리(Current Directory)에서 실행파일을 찾게된다.

 

lpCommandLine : 생성하는 프로세스에 인자를 전달할 때 이 두번째 매개변수를 사용한다. 첫번째 전달인자에 NULL을 전달하고, 두번째 전달인자에 실행파일의 이름을 전달할 수 있다. 이 경우 표준검색 경로를 기준으로 실행파일을 찾게된다.

 

lpProcessAttributes : 프로세스의 보안 속성을 지정할 때 사용하는 인자이다. 보통 NULL을 전달하고 디폴트 보안속성이 지정된다.

 

lpThreadAttributes : 쓰레드의 보안속성을 지정할 때 쓴다. NULL을 전달할 경우 디폴트 보안 속성이 지정된다.

 

hInheritHandle : 전달인자가 TRUE인 경우, 자식 프로세스는 부모 프로세스가 소유하는 핸들 중 일부(상속 가능한 핸들)를 상속한다.

 

dwCreationFlag : 생성하는 프로세스의 특성( ex)우선순위) 을 결정 지을때 사용되는 옵션이다.

 

lpEnvironment : 프로세스마다 EnvironmentBlock(환경 블록)이라는 메모리 블록을 관리한다. 이 블록을 통해서 프로세스가 실행에 필요로 하는 문자열을 지정할 수 있다.

 

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

 

lpStartupInfo : STARTUPINFO 구조체 변수를 초기화한 다음에 이 변수의 포인터를 전달한다. STARTUPINFO 구조체 변수는 생성하는 프로세스의 속성을 지정할 때 사용된다.

 

lpProcessInformation : 생성하는 프로세스 정보를 얻기위해 사용된다. PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달한다. 전달된 주소값이 가리키는 변수에 프로세스 정보가 채워진다.

 

 

STARTUPINFO 구조체 선언

typedef struct __STARTUPINFO{

     DWORD cb;

     LPTSTR lpReserved;

     LPTSTR lpDesktop;

     LPTSTR lpTitle;

     DWORD dwX;

     DWORD dwY;

     DWORD dwXSize;

     DWORD dwYSize;

     DWORD dwxCountChars;

     DWORD dwYCountChars;

     DWORD dwFillAttribute;

     DWORD dwFlags;

     WORD wShowWindow;

     WORD cbReserved2;

     LPBYTE lpReserved2;

     HANDLE hStdInput;

     HANDLE hStdOutput;

     HANDLE hStdError;

}STARTUPINFO, *LPSTARTUPINFO;

 

현재 디렉터리의 설정

일반적으로 프로세스가 생성되면 프로세스의 현재 디렉터리는 프로세스의 실행파일이 존재하는 디렉터리로 생성된다.

 

프로세스의 현재 디렉터리의 위치확인

DWORD GetCurrentDirectory(

     DWORD nBufferLength;

     LPTSTR lpBuffer

);

 

두번째 전달인자 lpBuffer는 현재 디렉터리 정보가 저장된 메모리 버퍼의 포인터이고, 첫번째 전달인자 nBufferLength는 현재 디렉터리 정보가 저장될 메모리 버퍼의 크기로서, 저장 가능한 문자열 길이정보가 전달되어야 한다.

 

BOOL SetCurrentDirectory(

     LPCTSTR lpPathName

);

위 함수 호출 시 lpPathName 전달인자를 통해서 현재 디렉터리를 변경할 수 있다.

 

CreateProcess 함수 호출시 아래와 같은 형태는 불가능하다.

CreateProcess(

     NULL,

     _T("ABC.exe 10 20"),

   NULL,

}

CreateProcess 함수는 내부적으로 두번째 인자로 전달된 문자열에 변경을 가한다. 그렇기 때문에 두번째 전달인자는 문자열의 변수 형태여야 한다.

 

CreateProcess 함수의 첫번째 전달인자를 통해서 실행파일의 이름을 전달할 경우, 현재 디렉터리 기준으로 실행파일을 찾게 되지만, 두번째 전달인자를 통해서 실행파일이름을 전달할 경우 아래의 표준 검색경로 순서대로 실행파일을 찾는다.

1.실행중인 프로세스의 실행파일이 존재하는 디렉터리

2.실행중인 프로세스의 현재 디렉터리

3.Windows의 시스템 디렉터리

4.Windows 디렉터리

5.환경변수 PATH에 의해 지정되어 있는 디렉터리

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90