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

Если процесс открыл более одного терминала, как мы можем узнать, какие файловые дескрипторы предназначены для управляющих терминалов сеанса процесса, а какие для неконтролирующих терминалов?

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

1 Ответ

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

Процесс не обязательно должен иметь какие-либо fds открытые на его управляющем tty.Однако, если у процесса есть управляющий терминал, он может открыть /dev/tty, чтобы получить для него fd.(Если у него нет управляющего tty, открытие /dev/tty завершится неудачно с ... ENXIO, по-видимому, это нигде не документировано, и я, честно говоря, ожидал бы ENODEV или ENOTTY вместо этого, но это непротиворечивоLinux и NetBSD, так что это, вероятно, официальная спецификация где-то .)

Узнать, открыт ли fd для управления tty вызывающего процесса, сложнее, чем может показаться.Очевидная вещь, которую нужно сделать, это сначала проверить, что она открыта на some tty с isatty, а затем вызвать tcgetpgrp для нее.tcgetpgrp задокументировано как сбой, если его аргумент fd не ссылается на tty, контролирующий вызывающий процесс.К сожалению, Linux, по крайней мере, также позволяет вызывать tcgetpgrp снаружи псевдотерминала (это то, что вы получаете, когда открываете /dev/ptmx), и мне не повезло найти хороший способ отличить действительный ttyснаружи псевдотерминала;isatty будет верно для обоих, большинство других связанных с терминалом операций могут применяться к обоим, и так далее.Возможно, вам придется прибегнуть к fstat и расшифровке st_rdev.Blech.

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