Группы процессов POSIX

в настоящее время я внедряю группы процессов в подсистему POSIX проекта моей операционной системы. Тем не менее, я немного запутался в спецификация POSIX (setsid) (вместе со страницей Википедии о группах процессов).

наш терминальный слой отправляет SIGINT в процесс переднего плана (группа, чей id должен равняться PID лидера группы). В этом случае этот процесс переднего плана (наше приложение" login") становится лидером группы, вызывая setsid. Когда пользователь входит в систему, программа разветвляется и выполняет оболочку пользователя. На этом этапе, насколько я понимаю, я называю setpgid от раздвоенного ребенка перед вызовом exec*. Это означает, что выполняемая программа с самого начала будет частью группы процессов.

если бы я хотел запустить недавно раздвоенного ребенка вне группы процессов, я бы просто позвонил setsid в раздвоенном ребенке перед вызовом exec*.

это правильно? Есть ли какие-то действительно неясные вещи, которыми я должен быть? проверяешь или делаешь?

на вопрос, который я думаю, я уже знаю, это требование fork для передачи членства в группе? Или это то, что нужно сделать с помощью setpgid после fork звонок? Я собираю группы процессов переносятся fork из определения POSIX fork.

спасибо заранее.

1 ответов


интересный вопрос - не в последнюю очередь потому, что он оставался без даже частичного ответа так долго.

базовые определения POSIX

некоторые цитаты из части определений POSIX:

Групповой Процесс 3.290

набор процессов, который позволяет сигнализацию связанных процессов. Каждый процесс в системе является членом группы процессов, которая определяется идентификатором группы процессов. Вновь созданный процесс присоединяется к процессу группа его создателя.

3.291 идентификатор группы процессов

уникальный положительный целочисленный идентификатор, представляющий группу процессов в течение ее жизни.

Примечание.: См .также повторное использование идентификатора группы процессов, определенное в разделе повторное использование идентификатора процесса.

3.292 Руководитель Группы Процессов

процесс, идентификатор которого совпадает с идентификатором группы процессов.

3.293 Срок Службы Группы Процессов

период времени, начинается, когда создается группа процессов, и заканчивается, когда последний оставшийся процесс в группе покидает группу, из-за окончания срока службы последнего процесса или последнего оставшегося процесса, вызывающего функции setsid() или setpgid ().

Примечание.: Функции setsid() и setpgid() подробно определены в томе системных интерфейсов POSIX.1-2008.

[...]

3.337 сессии

собрание процесса группы, созданные для целей контроля за работой. Каждая группа процессов является членом сеанса. Процесс считается членом сессии, членом которой является его группа процессов. Вновь созданный процесс присоединяется к сеансу своего создателя. Процесс может изменять членство в сеансе; см. setsid (). В одном сеансе может быть несколько групп процессов.

Примечание.: Функция setsid () подробно определена в томе системных интерфейсов POSIX.1-2008.

3.338 Лидера Сессии

процесс, который создал сессию.

Примечание.: Дополнительные сведения см. В разделе функция setsid (), определенная в томе системных интерфейсов POSIX.1-2008.

3.339 Продолжительность Жизни Сеанса

период между созданием сеанса и окончанием срока службы всех групп процессов, которые остаются членами сеанса.


система POSIX Интерфейсы

имя

setsid-создать сеанс и установить идентификатор группы процессов

справка

   #include <unistd.h>

   pid_t setsid(void);

описание

в setsid() функция создает новый сеанс, если вызывающий процесс не является лидером группы процессов. По возвращении вызывающий процесс является руководителем сессии этой новой сессии, является руководителем группы процессов новой группы процессов и не имеет управляющего терминала. Этот идентификатор группы процессов вызывающего процесса должен быть равен идентификатору процесса вызывающего процесса. Вызывающий процесс должен быть единственным процессом в новой группе процессов и единственным процессом в новой сессии.

и:

имя

setpgid - установить идентификатор группы процессов для управления заданиями

справка

   #include <unistd.h>

   int setpgid(pid_t pid, pid_t pgid);

описание

функция setpgid() должна либо присоединяться к существующей группа процессов или создайте новую группу процессов в сеансе вызывающего процесса.

идентификатор группы процессов руководителя сеанса не изменяется.

после успешного завершения идентификатор группы процессов процесса с идентификатором процесса, который соответствует pid, должен быть установлен в pgid.

в частном случае, если pid равен 0, должен использоваться идентификатор вызывающего процесса. Кроме того, если pgid равен 0, идентификатор процесса указанного процесса должен быть используемый.


толкование

как ясно из определений, сеанс может состоять из нескольких групп процессов. В широких пределах процесс может изменять группы процессов (хотя он принадлежит только одной группе процессов в любое время). Возможности для обработки сеанса более ограничены; в основном, процесс либо остается членом своего первоначального сеанса, либо может стать лидером нового сеанса.

копирование частей вопрос:

наш терминальный слой отправляет SIGINT в процесс переднего плана (группа, чей id должен равняться PID лидера группы). В этом случае этот процесс переднего плана (наше приложение "вход") становится лидером группы, вызывая setsid. Когда пользователь входит в систему, программа разветвляется и выполняет оболочку пользователя. На этом этапе я понимаю, что я вызываю setpgid из раздвоенного ребенка перед вызовом exec*. Это означает, что выполняемая программа будет частью группы процессов с самого начала.

Я подозреваю, что скобки должны быть " группа процесса переднего плана (чей идентификатор должен равняться PID лидера группы)". По определению (3.292) лидером группы процессов является процесс, PID которого совпадает с идентификатором группы процессов. Я не цитирую соответствующий материал, но я считаю, что отправка сигнала руководителю группы процессов является правильной

обратите внимание, что процесс переднего плана становится лидером сеанса, вызывая setsid(), а также становится лидером группы процессов. Я ожидал бы, что программа входа в систему настроит оболочку пользователя в качестве лидера группы процессов (и, вероятно, лидера сеанса) после разветвления, но перед выполнением оболочки. Все дочерние процессы наследуют группу процессов и сеанс от своих родительских процессов автоматически; вы должны переопределить это, если хотите, чтобы оно было другим.

если бы я хотел запустить недавно раздвоенный ребенок вне группы процессов, я бы просто назвал setsid в раздвоенный ребенок перед вызовом exec*.

вы можете сделать это, но это также создаст новый сеанс. Вы, вероятно, хотите использовать setpgid() (современный стандарт; возможно setpgrp() который является более старым стандартом от SVID), а не setsid().

это правильно? Есть ли какие-то действительно неясные вещи, которые я должен проверять или делать?

Да, это в основном правильно. Да, вероятно,есть некоторые неясные вещи, которые нужно отслеживать. Для например, вам может потребоваться подумать об управляющем TTY.

в качестве следующего вопроса, который я считаю, что уже знаю, является ли это требованием для fork для передачи членства в группе? Или это то, что должно быть сделано с помощью setpgid после каждого вызова вилки? Я собираю, что группы процессов передаются fork из определения POSIX fork.

дочерний процесс после fork() принадлежит к тому же набору групп (как в /etc/group), а также к тому же сессия и та же группа процессов - но это не лидер сессии и не лидер группы процессов.