Почему руководитель группы не может создать сеанс в 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 (Группы процессов, сеансы и управление заданиями).

Другие вопросы по тегам