这是我一段时间以来一直试图自己解决的问题,但没有任何运气。我正在尝试编写一个脚本(除其他外)可以采用任意 PID 并将其映射到 TTY 设备的路径(如果没有关联的 TTY,我正在编写的函数将返回“(notty)”)。
在我尝试执行上述操作时,我一直在尝试使用tty_nr在/proc/中[PID]/统计:
tty_nr %d (7) The controlling terminal of the process. (The
minor device number is contained in the
combination of bits 31 to 20 and 7 to 0; the major
device number is in bits 15 to 8.)
我可以提取主要号码和次要号码,没问题。当我尝试将其转换为设备路径时,我的问题就出现了:我是否只find
在 /dev 下进行匹配并接受第一个匹配?有没有更优雅的方法来做到这一点?
我确实找到了这似乎 python 脚本有某种 tty_nr 数字到物理路径的映射,但我找不到实际填充此列表的脚本的任何其他部分,以查看他们从哪里获取数据,看看我是否可以创建一个 Linux 模拟。也有可能它依赖于某些 BSD 主义,但我遇到了困难。
基本上,如果可以的话,我会尽量不启动另一个进程。此外,整个“启动一个结果数量未知但只获取第一个结果”的方法似乎有点……笨拙。由于我必须向其他人展示此代码,因此我希望有一种或多或少确定性的方法来完成此任务。我想要一些保证,如果(出于任何原因)/dev 下面有多个带有该主要/次要的设备文件(我知道,这是一种极端情况,但这会让我烦恼),我的代码将默认为任何TTY 的“官方”路径是。
当然,如果我对提取然后搜索方法的非确定性的担忧是没有根据的,那将是个好消息,我只想了解为什么它们是没有根据的。所有其他方法都失败了,我想我可以在扫描所有 /dev 之前尝试限制搜索常见路径(/dev/pts* /dev/tty* 等)。
答案1
您可以根据次要号码创建“官方”tty 名称并检查其是否存在(当然还有主要/次要号码)。如果次要号码是 5,那么您首先检查 tty5 是否存在并且具有正确的映射。如果其中一个失败,那么您必须进行搜索(并制定策略,如果存在多个匹配项,则返回什么内容)。
编辑1:
从Documentation/devices.txt
:
3 字符伪 TTY 从站 0 = /dev/ttyp0 第一个 PTY 从属设备 1 = /dev/ttyp1 第二个 PTY 从站 ... 255 = /dev/ttyef 第 256 个 PTY 从属 这些是旧式 (BSD) PTY 设备; Unix98 设备主要为 136 及以上。 4 个字符 TTY 设备 0 = /dev/tty0 当前虚拟控制台 1 = /dev/tty1 第一个虚拟控制台 ... 63 = /dev/tty63 第 63 个虚拟控制台 64 = /dev/ttyS0 第一个 UART 串口 ... 255 = /dev/ttyS191 第 192 个 UART 串口
答案2
我可能在这里遗漏了一些东西,但你能不能只使用ps
?
tty="/dev/`ps --no-headers -o tty -p pid`"