Использование и значение группы сеансов и процессов в Unix?
процессы Unix имеют идентификатор сеанса и являются частью группы процессов, которую можно изменить/запросить с помощью таких функций, как setsid()/getpgrp() .
однако концепция группы процессов и сеанса всегда ускользала от меня, может ли кто - нибудь объяснить, какое значение имеют отдельные сеансы и группы процессов-почему/когда нужно создать новый сеанс или поместить несколько процессов в одну и ту же сессию и/или группу процессов ?
2 ответа:
A групповой процесс представляет собой набор связанных процессов, которые могут быть сигнализированы все сразу.
A сессии представляет собой набор групп процессов, которые либо присоединены к одному оконечному устройству (известному как управляющий терминал) или не прикреплены к любому терминалу.
сеансы используются для управления заданиями: одна из групп процессов в сеансе является группой процессов переднего плана и может отправляться сигналами терминалом управляющий символ. Вы можете думать о сеансе с управляющим терминалом как о соответствующем "логину" на этом терминале. (Демоны обычно отключаются от любого управляющего терминала, создавая новый сеанс без него.)
например, если вы запустите
some_app
из оболочки оболочка создает для нее новую группу процессов и делает ее группой процессов переднего плана сеанса. (some_app
могут быть созданы некоторые дочерние процессы; по умолчанию они будут частью одного процесса группа.) Если вы нажмете^Z
,some_app
группа процессов сигнализирует о ее остановке; и группа процессов оболочки снова переключается на группу процессов переднего плана. Тогда, например,bg %1
начатьsome_app
снова группа процессов, но продолжайте работать в фоновом режиме.
The POSIX.Стандартный 1-2008 довольно читабельный (по крайней мере, я так думаю!) - взгляните на определения и соответствующие разделы "Общие Терминала Интерфейс" глава.
оболочки управления заданиями постоянно управляют сеансами или группами процессов. Вы можете отправить один и тот же сигнал всем процессам в группе процессов с одним вызовом POSIX
kill()
.стандарт POSIX говорит:
Если PID больше 0, сиг должен быть направлен процесс процесс, идентификатор которого равен PID-регулятора.
Если pid равен 0, sig должен быть отправлен во все процессы (за исключением неопределенного набора систем процессы), чей идентификатор группы процессов равен идентификатору группы процессов отправителя и для которого процесс имеет разрешение на отправку сигнала.
Если pid равен -1, sig должен быть отправлен во все процессы (за исключением неопределенного набора системных процессов), для которых процесс имеет разрешение на отправку этого сигнала.
если pid отрицательный, но не -1, sig должен быть отправлен всем процессам (за исключением неопределенного набора системных процессов), чей идентификатор группы процессов равен абсолютное значение pid, и для которого процесс имеет разрешение на отправку сигнала.
когда оболочка входа выходит, например, сигнал SIGHUP отправляется всем программам в своей группе процессов.
когда вы управляете программами на переднем плане или в фоновом режиме, вы используете группы процессов.
есть также управляющие терминалы, о которых нужно беспокоиться; сигналы, генерируемые управляющим терминалом, могут быть отправлены всем программам в группе процессов.