시스템 프로그래밍

5-2. 프로그래밍을 통한 프로세스의 생성

CalebHong 2022. 5. 13. 11:26

프로세스 생성 함수

Bool CreateProcess(

  LPCTSTR lpApllicationName,

  LPTSTR lpCommandLine,

  LPSECURITY_ATTRIBUTES lpProcessAttributes,

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  BOOL bInheritHandles,

  DWORD dwCreationFlags,

  LPVOID lpEnvironment,

  LPCTSTR lpCurrentDirectory,

  LPSTARTUPINFO lpStartupInfo,

  LPPROCESS_INFORMATION lpProcessInformation

);

 - LPSTARTUPINFO, LPPROCESS_INFORMATION 는 사용자가 구조체를 생성하여 인자로 전달해야 함

 - LPSTARTUPINFO는 정보 전달용, LPPROCESS_INFORMATION는 정보반환용

 

LPSTARTUPINFO

typedef struct _STARTUPINFO {
    DWORD cb; 			// 구조체 변수의 크기
    LPTSTR lpReserved;
    LPTSTR lpDesktop;
    LPTSTR lpTitle;		// 콘솔 윈도우의 타이틀 바 제목
    DWORD dwX;			// 프로세스 윈도우의 x 좌표
    DWORD dwY;			// 프로세스 윈도우의 y 좌표
    DWORD dwXSize;		// 프로세스 윈도우의 가로 길이
    DWORD dwYSize;		// 프로세스 윈도우의 세로 길이
    DWORD dwCountChars;
    DWORD dwYCountChars;
    DWORD dwFillAttribute;
    DWORD dwFlags;		// 설정된 멤버의 정보
    WORD wShowWindow;
    WORD cbReserved2;
    LPBYTE lpReserved2;
    HANDLE hStdInput;
    HANDLE hStdOutput;
    HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;

LPPROCESS_INFORMATION

typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;	// 프로세스의 핸들
    HANDLE hThead;	// 쓰레드 핸들
    DWORD dwProcessId;	// 프로세스의 ID
    DWORD dwThreadId;	// 쓰레드 ID
} PROCESS_INFORMATION;

표준 검색 경로

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

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

3. Windows의 시스템 디렉터리(System Directory)

4. Windows 디렉터리(Windows Directory)

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

 

자식 프로세스 생성 예제

#include <tchar.h>
#include <Windows.h>

#define DIR_LEN MAX_PATH+1

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi;

	si.cb = sizeof(si);
	si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;
	si.dwX = 100;
	si.dwY = 200;
	si.dwXSize = 300;
	si.dwYSize = 200;
	si.lpTitle = LPWSTR("I am a boy!");

	TCHAR command[] = _T("AdderProcess.exe 10 20");
	TCHAR cDir[DIR_LEN];
	BOOL state;

	GetCurrentDirectory(DIR_LEN, cDir); // 현재 디렉토리 확인.
	_fputts(cDir, stdout);
	_fputts(_T("\n"), stdout);

	SetCurrentDirectory(_T("C:\\WinSystem"));

	GetCurrentDirectory(DIR_LEN, cDir); // 현재 디렉토리 확인
	_fputts(cDir, stdout);
	_fputts(_T("\n"), stdout);

	state = CreateProcess(NULL, command, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); // 자식 프로세스 생성

	if (state != 0)
		_fputts(_T("Create OK! \n"), stdout);
	else
		_fputts(_T("Create Error! \n"), stdout);

	return 0;
}