- 프로세스: 시스템 자원들을 포함하는 하나의 주소공간
- 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 |