【问题标题】:How can we tell file descriptrs for controlling terminal from for noncontrolling terminal?我们如何区分用于控制终端的文件描述符和用于非控制终端的文件描述符?
【发布时间】:2018-06-01 19:56:14
【问题描述】:

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

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

【问题讨论】:

  • 显示创建终端的代码和你所说的文件描述符,然后我们就可以知道它们之间是否有区别。
  • 是什么让您认为它们中的任何一个都在控制终端?如果进程以控制终端启动,则相关 fd 为 0、1 和 2 的概率非常高。您创建的描述符取决于您的进程来跟踪。
  • @WilliamPursell 我想知道是否有任何现有的 fd 用于控制终端(如果有),以及如何将它们与非控制终端区分开来。
  • POSIX3.115 控制终端 与会话关联的终端。每个会话最多可以关联一个控制终端,一个控制终端只关联一个会话。来自控制终端的某些输入序列导致信号被发送到与控制终端关联的前台进程组中的所有进程。 一个进程只能与单个会话相关联,因此一个进程最多只能有,一个控制终端。

标签: c linux terminal


【解决方案1】:

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

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

【讨论】:

  • ENXIO is documented as "指定的文件是字符特殊文件或块特殊文件,与此特殊文件关联的设备不存在。" 确实如此有道理..有点。
  • 谢谢。 “我没有任何运气找到一种区分实际 tty 和伪终端外部的好方法”。 “伪终端的外部”是指伪终端的主机、从机还是双方?
  • 我的意思是除了我以外的人所说的主人。出于哲学原因,我避免使用“主”和“从”作为计算机术语;在这种情况下,我也认为“外部”和“内部”在概念上更清晰。
  • 谢谢。如果进程“没有控制 tty,打开 /dev/tty 将失败”(在您的回复中),“没有控制 tty 的会话负责人”如何“打开一些具体的终端设备”(在您的评论中)?还是后者是前者的例外?
  • 具体终端设备是 /dev 中的所有 other 字符特殊文件,其名称以“tty”开头,但随后添加了其他内容,例如/dev/tty0、/dev/ttyS0、/dev/ttyUSBblah。还有内部的伪终端设备,/dev/pts/0 等等。
猜你喜欢
  • 2021-04-19
  • 2021-12-27
  • 2013-03-23
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多