[WINDOWS VIA C/C++] 05.잡
https://www.hanbit.co.kr/store/books/look.php?p_code=B2974835990
제프리 리처의 Windows via C/C++(복간판)
이 책은 윈도우 XP, 윈도우 비스타, 윈도우 서버 2008까지 내용을 포괄한다. 이미 윈도우 10이 출시된 지 오래지만 윈도우의 기본 구조는 변하지 않아 아직까지도 이 책은 윈도우 시스템 프로그래
www.hanbit.co.kr
해당 책을 읽고 학습 목적으로 간단하게 정리한 글입니다.
개요
잡 오브젝트를 사용하면 프로세스를 묶어 다루거나, 샌드박스를 통해 프로세스에 제약을 걸 수 있다.
https://learn.microsoft.com/ko-kr/windows/win32/api/jobapi/nf-jobapi-isprocessinjob
IsProcessInJob 함수(jobapi.h) - Win32 apps
프로세스가 지정된 작업에서 실행 중인지 여부를 확인합니다.
learn.microsoft.com
해당 함수를 사용하면 프로세스가 특정 잡에 소속되어있는지 확인할 수 있다.
https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createjobobjecta
CreateJobObjectA function (winbase.h) - Win32 apps
Creates or opens a job object. (CreateJobObjectA)
learn.microsoft.com
CreateJobObject 함수를 통해 잡 오브젝트를 생성할 수 있다.
잡 오브젝트 또한 사용하지 않는다면 CloseHandle 호출을 해야 한다.
Job 내의 Process에 대한 제한사항 설정
샌드박스(제한사항의 집합) 설정을 위해
SetInformationJobObject 함수를 호출할 수 있다.
BOOL SetInformationJobObject(
[in] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[in] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength
);
JobObjectInformationClass에는 제한사항의 종류를 설정할 수 있다.
이에 따라 lpJobObjectInformation 값도 정해져있으니 확인해 넣으면 된다.
예를 들어
https://learn.microsoft.com/ko-kr/windows/win32/api/winnt/ns-winnt-jobobject_basic_limit_information
JOBOBJECT_BASIC_LIMIT_INFORMATION(winnt.h) - Win32 apps
작업 개체에 대한 기본 제한 정보를 포함합니다.
learn.microsoft.com
typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
LARGE_INTEGER PerProcessUserTimeLimit;
LARGE_INTEGER PerJobUserTimeLimit;
DWORD LimitFlags;
SIZE_T MinimumWorkingSetSize;
SIZE_T MaximumWorkingSetSize;
DWORD ActiveProcessLimit;
ULONG_PTR Affinity;
DWORD PriorityClass;
DWORD SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
이러한 클래스를 지정할 수 있다.
typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
DWORD UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
이 제한사항 클래스의 경우 플래그를 조 합해 UIRestrictionsClass를 만든다.
이 플래그 중 JOB_OBJECT_UILIMIT_HANDLES는 잡 외부의 프로세스가 생성한 유저 오브젝트를 잡 내부의 프로세스가 접근하지 못하도록 만든다.
QueryInformationObject()함수를 호출하면 잡에 대해 어떤 제한사항이 걸려있는지 확인할 수 있다.\
https://learn.microsoft.com/ko-kr/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject
QueryInformationJobObject 함수(jobapi2.h) - Win32 apps
작업 개체에서 제한 및 작업 상태 정보를 검색합니다.
learn.microsoft.com
제한사항 탐색 외에도 통계 등 여러 정보를 해당 함수를 통해 얻을 수 있다.
Job 내에 Process 배치하기
잡 내에 프로세스를 배치하기 위해서 AssignProcessToJobObject()를 호출한다.
프로세스가 이미 다른 잡에 포함된다면 실패한다.
부모 프로세스가 잡에 소속되어있다면 부모가 생성한 자식 프로세스는 동일한 잡에 소속된다.
Job 내의 모든 프로세스 종료하기
잡 내의 모든 프로세스 종료를 위해서는 TerminateObject함수를 호출한다.
Job 통지
Job내에서 일어난 특정 상황에 대해 통지 받고 싶다면 잡 통지 기능을 사용한다.
1. 잡 내의 프로세스가 모두 할당된 CPU 시간을 모두 사용한다면 Job Object가 Signaled 상태가 되므로 이를 활용해볼 수 있다.
2. I/O Completion Port와 SetInformationJobObject를 사용하면 잡 통지가 발생 시 Completion Port를 통해 통지받을 수 있다.
Completion Port에 통지가 갔기 때문에 이러한 정보를 받아오기 위해 GetQueuedCOmpletionStatus 함수를 통해 통지를 받아온다.