Les processus Unix ont un identifiant de session et font partie d'un groupe de processus - qui peut être modifié/interrogé avec des fonctions telles que setsid ()/getpgrp ().
Cependant, le concept d'un groupe de processus et d'une session m'a toujours échappé, est-ce que quelqu'un pourrait expliquer quelle importance avoir des sessions et des groupes de processus distincts - pourquoi/quand veut-on créer une nouvelle session ou placer plusieurs processus dans la même session et/ou groupe de processus ?
Un groupe de processus est un ensemble de processus associés qui peuvent tous être signalés en même temps.
Une session est une collection de groupes de processus, qui sont soit attachés à un seul périphérique terminal (connu sous le nom de contrôle terminal ) ou non attaché à un terminal.
Les sessions sont utilisées pour le contrôle des travaux: l'un des groupes de processus de la session est le groupe de processus de premier plan et peut recevoir des signaux par des caractères de contrôle de terminal. Vous pouvez considérer une session avec un terminal de contrôle comme correspondant à une "connexion" sur ce terminal. (Les démons se dissocient normalement de tout terminal de contrôle en créant une nouvelle session sans celle-ci.)
par exemple. si vous exécutez some_app
à partir du shell, le shell crée un nouveau groupe de processus pour lui et en fait le groupe de processus de premier plan de la session. (some_app
Peut créer des processus enfants; par défaut, ils feront partie du même groupe de processus.) Si vous appuyez ensuite sur ^Z
, Le groupe de processus de some_app
Est signalé à arrête ça; et le groupe de processus Shell est commuté pour être à nouveau le groupe de processus de premier plan. Ensuite, par exemple, bg %1
Redémarrerait le groupe de processus de some_app
, Mais le maintiendra en arrière-plan.
Le norme POSIX.1-2008 est assez lisible (du moins, je pense que oui!) - jetez un œil aux définitions et aux sections pertinentes du "General Terminal Interface" chapitre.
Les coques de contrôle des tâches manipulent constamment les sessions ou les groupes de processus. Vous pouvez envoyer le même signal à tous les processus d'un groupe de processus avec un seul appel à la fonction POSIX kill()
.
La norme POSIX dit:
Si pid est supérieur à 0, sig doit être envoyé au processus dont l'ID de processus est égal à pid.
Si pid est 0, sig doit être envoyé à tous les processus (à l'exclusion d'un ensemble non spécifié de processus système) dont l'ID de groupe de processus est égal à l'ID de groupe de processus de l'expéditeur et pour lesquels le processus est autorisé à envoyer un signal.
Si pid est -1, sig doit être envoyé à tous les processus (à l'exclusion d'un ensemble non spécifié de processus système) pour lesquels le processus est autorisé à envoyer ce signal.
Si pid est négatif, mais pas -1, sig doit être envoyé à tous les processus (à l'exclusion d'un ensemble non spécifié de processus système) dont l'ID de groupe de processus est égal à la valeur absolue de pid, et pour lesquels le processus a la permission d'envoyer un signal .
Lorsqu'un shell de connexion se ferme, par exemple, un signal SIGHUP est envoyé à tous les programmes de son groupe de processus.
Lorsque vous manipulez des programmes en avant-plan ou en arrière-plan, vous utilisez des groupes de processus.
Il existe également des terminaux de contrôle dont il faut s'inquiéter; les signaux générés par un terminal de commande peuvent être envoyés à tous les programmes d'un groupe de processus.