Управляющий терминал описывается во многих документах как свойство всего сеанса, но на самом деле это свойство каждого отдельного процесса, которое наследуется от родителя к потомку в fork
.Процесс должен быть лидером сеанса, чтобы присоединиться к управляющему tty, но любой процесс может отсоединиться от своего контролируемого tty, если он есть, с помощью TIOCNOTTY
ioctl.Таким образом, система настроена для обработки процессов, которые находятся в сеансе, но не подключены к управляющему tty.
В вашем "втором сценарии" процессы, которые руководитель сеанса разветвил перед подключением к управляющему tty, делают не привязывайся к этому tty вместе с ним.Это означает, что они не являются полностью частью сеанса, точно так же, как процессы, которые отсоединились от управляющего tty, не являются полностью частью сеанса: их нельзя вывести на передний план с помощью tcsetpgrp
, они не могут открыться/dev/tty
, они не получают SIGHUP
, если зависает управляющий tty и т. Д. Процессы, которые руководитель сеанса разветвляет после присоединения управляющего tty, с другой стороны, наследуют его как обычно.
(Как правило, в Unix, операции, которые манипулируют состоянием вызывающего процесса , никогда не оказывают никакого влияния на любой другой процесс, даже если кажется, что они должны; также, как правило, когда мы говорим,такой-то и наследуется через fork
, мы имеем в виду, что часть состояния копируется в дочерний элемент, а не совместно используется родительским и дочерним элементами. Важным исключением являются «описания открытых файлов», которые are shared. Если у вас есть открытый файл, открытый в процессе, который разветвляется, и потомок вызывает lseek
в своем унаследованном дескрипторе файлаили родитель увидит перемещение указателя поиска.)