如何判断一个Linux TTY是否正在控制一个进程组

所以我有一个tty(比方说/ dev / tty5),并且想知道它是否当前是一个进程组或会话的控制权,还是它当前是不拥有的。 POSIX有两个API函数,分别表示它们:tcgetpgrp()和tcgetsid(),这两个函数只有在调用者具有tty作为控制tty的情况下才起作用 – 这在这种情况下使得它们几乎没有用处(事实上, t根本看不到tcgetsid()的点)。

任何人都有一个build议,我可以从一个理智的方式检测,从C,terminal是否是一个过程的控制terminal? 我只关心Linux,所以如果Linux特定的API是必要的,那对我来说是很好的。

BSD:int ioctl(int tty,TIOCGETPGRP,int * foreground_group);

Linux:int tcgetpgrp(int tty,int * foreground_group);

Linux只有在你拥有非自主终端的权限时才能正常工作,即你是root用户。 这是一个有意的安全实施。 BSD ioctl()允许任何tty将其任何进程组(甚至不允许进程组)作为其前台tty。 POSIX只允许访问具有tty作为其控制权的进程组。 这个限制不允许在BSD ioctl中出现一些模棱两可和破坏安全的情况。

你想做什么? 如果你是内核提供信号,你应该只是担心流程控制的tty。

编辑:我忘了/ proc
来自www.die.net:/ proc / [number] / fd这是一个子目录,其中包含进程已打开的每个文件的一个条目,由其文件描述符命名,并且是实际文件的符号链接。 因此,0是标准输入,1个标准输出,2个标准错误等。

作为系统调用“ps au> tempfile.txt”执行此操作,并解析文件。

不知道这是否正好赶上你的需要,无论如何这里是:

#include <stdlib.h> #include <stdio.h> int main() { int status = system("fuser /dev/tty1 >/dev/null 2>/dev/null") >> 8; printf("%s", status ? "tty not in use as a text terminal.\n" : "tty in use as a text terminal.\n"); return 0; } 

如果知道进程的PID,则可以使用proc文件系统查询进程的控制tty。

/ proc // fd / 0是tty的一个符号链接(比如/ dev / pts / 4)。

所以你所要做的就是用PID创建一个proc路径(例如:/ proc / 7834 / fd / 0,其中7834是PID),然后调用readlink系统调用来获取tty

请参阅下面的C代码片段

 sprintf(procPath, "/proc/%s/fd/0", pid); int ret = readlink(procPath, buffer, MAX_LEN); buffer[ret] = '\0';