如果一个进程打开了多个终端,我们如何知道哪些文件描述符用于进程'会话的控制终端,哪些用于非控制终端?
答案 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
。布莱什。