Les jobs sous windows

Développement système natif en c/c++ avec win32 ...

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 19
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Les jobs sous windows

Post by Hydraxx »

# Les Job Objects sous Windows

Aujourd’hui nous allons voir un mécanisme avancé mais fondamental du dev système :
**les Job Objects**.

Beaucoup de développeurs utilisent CreateProcess sans jamais vraiment contrôler ce que deviennent les processus enfants.
Les Job Objects existent précisément pour ça.

Ici on va voir **ce qu’est un Job Object**, comment Windows les gère, et comment les utiliser proprement en Win32.

---

# 1) C’est quoi un Job Object

Un **Job Object** est un conteneur noyau de **processus**.

Il permet de :

* regrouper plusieurs processus
* appliquer des règles globales
* limiter les ressources
* contrôler la durée de vie
* tuer tout un groupe proprement

Un Job Object :

* ne contient **PAS** de threads
* ne s’applique **PAS** à la mémoire globale du système
* agit uniquement sur les processus qui lui sont assignés

---

# 2) À quoi sert un Job Object

Sans Job Object :

* chaque processus est indépendant
* aucun contrôle global
* nettoyage manuel compliqué

Avec Job Object :

* contrôle centralisé
* confinement simple
* supervision
* nettoyage automatique

C’est très utilisé par :

* navigateurs
* services Windows
* sandbox
* antivirus
* outils de test

---

# 3) Créer un Job Object

Pour créer un Job Object :

Code: Select all

HANDLE hJob = CreateJobObjectW(NULL, L"MyJob");
À savoir :

* le nom est optionnel
* retourne un handle noyau
* le job est vide au départ

---

# 4) Un Job Object ne fait rien tout seul

Créer un Job Object **ne change rien**.

Un Job Object devient actif uniquement quand **un processus y est assigné**.

Sans processus assigné :

* aucune limite
* aucun contrôle
* aucun effet

---

# 5) Assigner un processus à un Job

Pour assigner un processus :

Code: Select all

AssignProcessToJobObject(hJob, hProcess);
Important :

* le processus doit avoir les bons droits
* un processus ne peut appartenir qu’à **un seul job**
* une fois assigné, il ne peut plus en sortir

---

# 6) Définir des limites sur un Job

La structure de base est :

**JOBOBJECT_BASIC_LIMIT_INFORMATION**

Code: Select all

JOBOBJECT_BASIC_LIMIT_INFORMATION info = {0};

info.LimitFlags = JOB_OBJECT_LIMIT_ACTIVE_PROCESS;
info.ActiveProcessLimit = 2;
Quelques flags importants :

* JOB_OBJECT_LIMIT_ACTIVE_PROCESS
* JOB_OBJECT_LIMIT_PROCESS_TIME
* JOB_OBJECT_LIMIT_JOB_TIME
* JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
* JOB_OBJECT_LIMIT_WORKINGSET

---

# 7) Appliquer les limites au Job

Les limites sont appliquées avec :

Code: Select all

SetInformationJobObject(
hJob,
JobObjectBasicLimitInformation,
&info,
sizeof(info)
);
Bonne pratique :

* configurer le job
* puis assigner les processus

---

# 8) Limiter la mémoire d’un processus

Pour la mémoire, on utilise :

**JOBOBJECT_EXTENDED_LIMIT_INFORMATION**

Code: Select all

JOBOBJECT_EXTENDED_LIMIT_INFORMATION ext = {0};

ext.BasicLimitInformation.LimitFlags =
JOB_OBJECT_LIMIT_PROCESS_MEMORY |
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;

ext.ProcessMemoryLimit = 50 * 1024 * 1024;
Puis :

Code: Select all

SetInformationJobObject(
hJob,
JobObjectExtendedLimitInformation,
&ext,
sizeof(ext)
);
---

# 9) Tuer tous les processus automatiquement

Le flag le plus important :

Code: Select all

JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
Effet :

* quand le handle du job est fermé
* tous les processus du job sont terminés

Avantages :

* pas de fuite
* pas de zombie
* cleanup garanti

---

# 10) Exemple complet minimal

Code: Select all

STARTUPINFOW si = {0};
PROCESS_INFORMATION pi = {0};

si.cb = sizeof(si);

CreateProcessW(
L"C:\Windows\System32\notepad.exe",
NULL,
NULL,
NULL,
FALSE,
CREATE_SUSPENDED,
NULL,
NULL,
&si,
&pi
);

HANDLE hJob = CreateJobObjectW(NULL, NULL);

JOBOBJECT_BASIC_LIMIT_INFORMATION info = {0};
info.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;

SetInformationJobObject(
hJob,
JobObjectBasicLimitInformation,
&info,
sizeof(info)
);

AssignProcessToJobObject(hJob, pi.hProcess);
ResumeThread(pi.hThread);
---

# 11) Surveiller un Job Object

Pour interroger un job :

Code: Select all

QueryInformationJobObject(...);
Cela permet d’obtenir :

* nombre de processus actifs
* consommation CPU
* consommation mémoire
* violations de limites

---

# 12) Job Object et hiérarchie

Sous Windows :

* un job n’est pas un parent
* un job n’est pas une hiérarchie
* c’est un lien de contrôle

Tout est explicite.

---

# 13) Erreurs classiques

* confondre job et thread
* essayer d’assigner un thread
* oublier KILL_ON_JOB_CLOSE
* fermer le job trop tôt
* penser qu’un processus peut changer de job

---

# À retenir

Un Job Object est un conteneur de processus.
Il permet de contrôler ressources et durée de vie.
Il ne gère jamais les threads.
Un processus ne peut appartenir qu’à un seul job.
KILL_ON_JOB_CLOSE est essentiel.

Comprendre les Job Objects, c’est comprendre comment Windows gère des groupes de processus.

Who is online

Users browsing this forum: No registered users and 1 guest