Réponses:
Sous Linux, chaque processus est associé à plusieurs ID, notamment:
ID de processus (PID)
Il s'agit d'un nombre arbitraire identifiant le processus. Chaque processus a un ID unique, mais une fois que le processus s'est arrêté et que le processus parent a récupéré le statut de sortie, l'ID de processus est libéré pour être réutilisé par un nouveau processus.
Parent Process ID (PPID)
Il s’agit simplement du PID du processus qui a démarré le processus en question.
ID de groupe de processus (PGID)
Il s'agit simplement du PID du responsable du groupe de processus. Si PID == PGID, alors ce processus est un chef de groupe de processus.
ID de session (SID)
Il s'agit simplement du PID du responsable de la session. Si PID == SID, ce processus est un leader de session.
Les sessions et les groupes de processus ne sont que des moyens de traiter un certain nombre de processus liés comme une unité. Tous les membres d'un groupe de processus appartiennent toujours à la même session, mais une session peut avoir plusieurs groupes de processus.
Normalement, un shell sera un leader de session et chaque pipeline exécuté par ce shell sera un groupe de processus. Cela permet de tuer facilement les enfants d'un obus lors de sa sortie. (Voir la sortie (3) pour les détails sanglants.)
Je ne pense pas qu'il existe un terme spécial pour un membre d'une session ou d'un groupe de processus qui n'est pas le leader.
Un responsable de session est un processus où identifiant de session == identifiant de processus. Cela semble artificiel, mais l’identifiant de session est hérité par les processus enfants. Certaines opérations sous UNIX / Linux fonctionnent sur des sessions de processus, par exemple, en annulant l'identifiant du processus lors de l'envoi à l'appel ou à la commande kill system. L'utilisation la plus courante de cela est lors de la déconnexion d'un shell. Le système d'exploitation kill -HUP -$$
enverra un message SIGHUP (blocage) à tous les processus avec le même identifiant de session que le shell. Lorsque vous désavouez un processus, l'ID de session du processus est modifié à partir du shell afin qu'il ne réponde pas au signal de raccrochage. Ceci est une partie du processus pour devenir un processus démon.
La plupart des processus appelés à partir du gestionnaire de fenêtres / environnement graphique ont le même identifiant de session que l'un des programmes de démarrage. Cela permet au système d'exploitation d'effectuer la même kill -HUP -$$
opération sur tous les programmes: tels que votre navigateur, votre lecteur de musique, libreoffice, votre client de messagerie instantanée, etc. Il s'agit des processus qui ne sont pas des chefs de session.
Je pensais connaître la réponse à cette question, mais j’ai écrit un programme C pour comprendre cela.
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t sid, mypid, pgid, gid;
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
if (!fork())
{
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("child PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
_exit(0);
}
return 0;
}
Je l'ai compilé avec cc -g -o sid sid.c
je l'ai couru de différentes manières, pour voir ce qui se passe:
./sid
nohup ./sid > sid.out
setsid ./sid
J'ai été un peu surpris par ce que Linux (2.6.39) a rendu. J'ai également trouvé la page de manuel de la section 7, "Informations d'identification".
Mon conseil est de le faire man 7 credentials
(ou l’équivalent si ce n’est pas sous Linux), et lisez la section sur le groupe de processus et la session pour voir si vous pouvez le résoudre.
./sid
et nohup ./sid
, et lorsque vous exécutez setsid ./sid
, l'identifiant de session (SID) est tout neuf et est le même que le processus PID ... Je Je ne sais pas pourquoi nohup a empêché la fourche (ou semble le faire), mais je pense que j'ai une idée générale ...
ps xao pid,ppid,pgid,sid,comm
pour afficher ces identifiants.