Почему руководитель группы не может создать сеанс в Linux
Почему руководитель группы не может создать сеанс. но кроме лидера группы, способного создать сеанс?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main() {
int pid;
int ppid=getppid();
if ( setsid() < 0)
perror("ERROR");
if((pid=fork()) == 0)
{
printf("proces1=%d %d\n",getpid(),getpgrp());
int s=getpgrp();
//setpgid(pid,pid);
if (setpgid(pid,0) < 0)
perror("ERROR");
printf("group after proces=%d %d\n",getpid(),getpgrp());
exit(0);
}
wait(0);
printf("group after proces=%d %d\n",getpid(),getpgrp());
}
Пожалуйста, объясни.
1 ответ
Короткий ответ
Запрещая setsid()
в POSIX требуется лидер группы процессов:
setsid()
Функция должна создать новый сеанс, если вызывающий процесс не является лидером группы процессов.
Необходимо убедиться, что все члены группы процессов являются членами одного и того же сеанса.
Длинный ответ
ID группы процессов - это PID лидера группы процессов. Идентификатор сеанса - это PID лидера сеанса. После успешного setsid()
вызов, идентификатор группы процессов, идентификатор сеанса и PID должны быть одинаковыми.
Однако для лидера группы процессов идентификатор группы процессов уже равен PID. Если бы можно было позвонить setsid()
его идентификатор группы процессов остается неизменным, так что:
- руководитель группы процессов принадлежит новой сессии;
- другие члены группы процессов принадлежат старому сеансу.
Таким образом, в этом случае у нас есть группа процессов, члены которой принадлежат к разным сеансам. POSIX хочет запретить эту ситуацию.
Зачем?
Группы процессов и сеансы были придуманы для контроля работы. Группы процессов используются для определения групп переднего и заднего плана, так что группа переднего плана будет получать сигналы от терминала.
Для реализации этого терминал отслеживает свою текущую группу процессов переднего плана и отправляет сигнал этой группе, когда происходит какое-либо событие.
Но это предполагает, что все процессы из любой данной группы процессов используют один и тот же управляющий терминал, поэтому сигналы, отправляемые терминалом, имеют для них значение.
Управляющий терминал разделяется по следующим правилам:
- все процессы из одного сеанса используют один и тот же управляющий терминал;
- процессы из разных сессий не могут использовать один и тот же управляющий терминал.
Таким образом, если мы требуем, чтобы все члены группы процессов совместно использовали один и тот же управляющий терминал, мы также должны требовать, чтобы они были членами одного и того же сеанса.
Ссылка
См. "Интерфейс программирования Linux", глава 34 (Группы процессов, сеансы и управление заданиями).