如何从非控制终端告诉控制终端的文件描述符?

时间:2018-06-01 19:56:15

标签: c linux terminal

如果一个进程打开了多个终端,我们如何知道哪些文件描述符用于进程'会话的控制终端,哪些用于非控制终端?

来自https://unix.stackexchange.com/questions/446207/for-a-process-what-are-the-differences-between-a-controlling-terminal-and-non-c

1 个答案:

答案 0 :(得分:3)

进程不一定在其控制tty上打开任何 fds。但是,如果进程具有控制终端,则可以打开/dev/tty以获取它的fd。 (如果它没有控制tty,打开/dev/tty将失败,恩,ENXIO,显然,这没有记录在我能找到的任何地方,老实说我会期望ENODEV或ENOTTY,但它是在Linux和NetBSD上保持一致,所以它可能是官方规范某处。)

了解fd是否在调用进程的控制tty上是开放的,这比看起来更难。显而易见的是,首先,使用isatty验证它是否在某些 tty上打开,然后在其上调用tcgetpgrp。如果fd参数没有引用调用进程的控制tty,则tcgetpgrp被记录为失败。不幸的是,Linux至少也允许一个人在伪终端的外面调用tcgetpgrp(这是你打开/dev/ptmx时得到的),而且我没有运气找到一个好的方法区分实际tty与伪终端的外部; isatty对两者都适用,大多数其他与终端相关的操作都可以应用于两者,依此类推。您可能不得不诉诸fstat并解码st_rdev。布莱什。