C, C++/WINDOWS VIA C,C++

[WINDOWS VIA C/C++] 05.잡

Basaeng 2025. 8. 21. 02:04

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 함수를 통해 통지를 받아온다.