Использование и значение сеанса и группы процессов в Unix?

83

Процессы Unix имеют идентификатор сеанса и являются частью группы процессов, которую можно изменить / запросить с помощью таких функций, как setsid () / getpgrp ().

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

Хабалуза
источник

Ответы:

104

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

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

Сеансы используются для управления заданиями: одна из групп процессов в сеансе является группой процессов переднего плана и может отправлять сигналы с помощью управляющих символов терминала. Вы можете думать о сеансе с управляющим терминалом как о «входе в систему» ​​на этом терминале. (Демоны обычно отключаются от любого управляющего терминала, создавая новый сеанс без такового.)

например, если вы запускаете some_appоболочку, оболочка создает для нее новую группу процессов и делает ее основной группой процессов сеанса. ( some_appМожет создать несколько дочерних процессов, по умолчанию они будут частью той же самой группе процесса.) Если затем нажмите ^Z, some_app«s группа процесса сигнализируется , чтобы остановить его; и группа процессов оболочки снова переключается на группу процессов переднего плана. Затем, например, bg %1снова запустит some_appгруппу процессов, но продолжит работу в фоновом режиме.


Стандарт POSIX.1-2008 довольно читабелен (по крайней мере, я так думаю!) - взгляните на определения и соответствующие разделы главы «Общий интерфейс терминала» .

Мэтью Слэттери
источник
3
Это очень хорошее объяснение с дополнительной информацией, которая могла бы появиться в виде вопросов позже
GP92
@MatthewSlattery - это одно terminalи terminal deviceто же и упоминается в документе?
alhelal
12

Оболочки управления заданиями постоянно управляют сеансами или группами процессов. Вы можете отправить один и тот же сигнал всем процессам в группе процессов с помощью одного вызова kill()функции POSIX .

Стандарт POSIX гласит:

Если pid больше 0, sig должен быть отправлен процессу, идентификатор процесса которого равен pid.

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

Если pid равен -1, sig должен быть отправлен всем процессам (за исключением неопределенного набора системных процессов), для которых процесс имеет разрешение на отправку этого сигнала.

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

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

Когда вы переводите программы на передний или задний план, вы используете группы процессов.

Есть также управляющие терминалы, о которых нужно беспокоиться; сигналы, генерируемые управляющим терминалом, могут быть отправлены всем программам в группе процессов.

Джонатан Леффлер
источник