Как существующие процессы в сеансе узнают и получают управляющий терминал, только что полученный лидером сеанса? - PullRequest
0 голосов
/ 01 июня 2018

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

Во втором сценарии, если в сеансе уже есть несколько процессов, но нет управляющего терминала, а затем ведущий создает соединение с управляющим терминалом, как насчет других процессов в сеансе:

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

  • как они могут открыть управляющий терминал как дескриптор файла?

Спасибо.

Происходит от https://unix.stackexchange.com/questions/446207/for-a-process-what-are-the-differences-between-a-controlling-terminal-and-non-c

1 Ответ

0 голосов
/ 01 июня 2018

Управляющий терминал описывается во многих документах как свойство всего сеанса, но на самом деле это свойство каждого отдельного процесса, которое наследуется от родителя к потомку в fork.Процесс должен быть лидером сеанса, чтобы присоединиться к управляющему tty, но любой процесс может отсоединиться от своего контролируемого tty, если он есть, с помощью TIOCNOTTY ioctl.Таким образом, система настроена для обработки процессов, которые находятся в сеансе, но не подключены к управляющему tty.

В вашем "втором сценарии" процессы, которые руководитель сеанса разветвил перед подключением к управляющему tty, делают не привязывайся к этому tty вместе с ним.Это означает, что они не являются полностью частью сеанса, точно так же, как процессы, которые отсоединились от управляющего tty, не являются полностью частью сеанса: их нельзя вывести на передний план с помощью tcsetpgrp, они не могут открыться/dev/tty, они не получают SIGHUP, если зависает управляющий tty и т. Д. Процессы, которые руководитель сеанса разветвляет после присоединения управляющего tty, с другой стороны, наследуют его как обычно.

(Как правило, в Unix, операции, которые манипулируют состоянием вызывающего процесса , никогда не оказывают никакого влияния на любой другой процесс, даже если кажется, что они должны; также, как правило, когда мы говорим,такой-то и наследуется через fork, мы имеем в виду, что часть состояния копируется в дочерний элемент, а не совместно используется родительским и дочерним элементами. Важным исключением являются «описания открытых файлов», которые are shared. Если у вас есть открытый файл, открытый в процессе, который разветвляется, и потомок вызывает lseek в своем унаследованном дескрипторе файлаили родитель увидит перемещение указателя поиска.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...