반응형
  • 프로세스: 시스템 자원들을 포함하는 하나의 주소공간
  • CreateProcess함수: 프로세스에서 새로운 프로세스를 생성
  • 부모 프로세스: CreateProcess를 호출하는 프로세스
  • 자식 프로세스: CreateProcess함수를 통해 만들어진 프로세스

BOOL CreateProcess(
  [in, optional]      LPCSTR                lpApplicationName,    // 실행파일 명(반드시 확장자 지정)
  [in, out, optional] LPSTR                 lpCommandLine,        // 명령행 인수(확장자 생략 시 .exe)
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 프로세스 커널 오브젝트의 보안 속성을 지정
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 쓰레드 커널 오브젝트의 보안 속성을 지정
  [in]                BOOL                  bInheritHandles,           // 상속 여부를 결정
  [in]                DWORD                 dwCreationFlags,        // 프로세스의 플래그 설정
  [in, optional]      LPVOID                lpEnvironment, // 환경 변수 문자열을 포함하고 있는 메모리 블록을 가리키는

                                                                           포인터
  [in, optional]      LPCSTR                lpCurrentDirectory,   // 현재 드라이브와 디렉토리를 설정
  [in]                LPSTARTUPINFO        lpStartupInfo,       // STARTUPINFO or STARTUPINFOEX 구조체의 포인터
  [out]               LPPROCESS_INFORMATION lpProcessInformation
);

  • lpCommandLine: const char* 형의 매개변수를 전달할 경우 에러, 프로세스에 인자를 전달하거나 첫번째 인자가 NULL일 경우 실행파일의 이름(표준 검색경로 기준)을 전달
  • bInheritHandles: ture 일 경우 자식 프로세스는 부모 프로세스가 소유하는 handle 중 일부를 상속
  • dwCreationFlags: 우선순위 같은 생성되는 프로세스의 특성을 결정지을 때 사용
FLAG 의미
CREATE_NEW_CONSOLE 새로운 콘솔 윈도우 생성
DEBUG_PROCESS 부모 프로세스가 자식 프로세스와 자식이 생성하는 모든 프로세스를 디버깅
자식 프로세스들에게서 이벤트가 발생하면 부모 프로세스로 통보
INHERIT_PARENT_AFFINITY 부모 프로세스의 Affinity를 상속받음 
  • lpEnvironment: 프로세스의 메모리 블록인 Environment block을 이용 프로세스가 실행 시 전달인자를 통해 생성하는 Environment block을 지정 (NULL일 경우 자식 프로세스는 부모 프로세스의 Environment block을 복사)
  • lpCurrentDirectory: 생성하는 프로세스의 현재 디렉터리를 완전경로로 설정 (NULL일 경우 부모 츠로세스의 디렉터리를 현재 디렉터리로 함)
typedef struct _STARTUPINFOA {
  DWORD  cb;                   // 구조체 변수의 크기
  LPSTR  lpReserved;
  LPSTR  lpDesktop;
  LPSTR  lpTitle;                 // 콘솔 윈도우의 타이틀
  DWORD  dwX;                // 프로세스 윈도우의 x좌표
  DWORD  dwY;                // 프로세스 윈도우의 y좌표
  DWORD  dwXSize;
  DWORD  dwYSize;
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;
  DWORD  dwFillAttribute;
  DWORD  dwFlags;            // 설정된 멤버의 정보
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
  • lpProcessInformation: 생성하는 프로세스의 정보를 얻음 (PROCESS_INFORMATION 구조체 변수의 주소값)
typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

 

// 부모 프로세스

// cretaeprocess (자식/부모)
#include <Windows.h>
#include <tchar.h>
int gval = 10;
int main(int argc, char* 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 = { 0, };

	TCHAR CommandLine[] = "E:\\repos_n\\TCPex2\\Debug\\TCPex2.exe";
	
	BOOL state;
	state = CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &SI, &PI);
	if (state == NULL)
	{
		printf("fail\n");
		return -1;
	}
	else
	{
		printf("success\n");
		
	}
	getchar();
	return 0;
}

// 자식 프로세스

#include <Windows.h>
int main(int argc, char*argv[])
{
	if (argc != 2)
		return -1;
	printf("this is child\n");
	getchar();
	return 0;
}
반응형

'프로그래밍의 기초 > TCP | IP' 카테고리의 다른 글

프로세스 & 좀비 프로세스  (0) 2022.01.18
프로세스와 스케줄러  (0) 2022.01.18
프로세스 이해와 활용  (0) 2022.01.14
TCP_NODELAY  (0) 2022.01.14
SO_REUSEADDR  (0) 2022.01.14

+ Recent posts