Процесс не обязательно должен иметь какие-либо 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.