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

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

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

2 ответа

Решение

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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