如何确定Linux TTY是否正在控制进程组

时间:2010-07-06 20:04:03

标签: c linux process tty

所以我有一个tty(让我们说/ dev / tty5)并且想要知道它当前是否是进程组或会话的控制tty,或者它是否当前是无主的。 POSIX有两个API函数,它们在这里建议:tcgetpgrp()和tcgetsid(),这两个函数只有在调用者将tty作为控制tty的情况下才有效 - 在这种情况下,它们使得它们几乎无用(实际上我不是t看到tcgetsid()的重点。

任何人都有一个建议我如何能够以一种理智的方式从C中检测终端当前是否是一个进程的控制终端?我只关心Linux,所以如果需要特定于Linux的API,那对我来说没问题。

4 个答案:

答案 0 :(得分:1)

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作为其控制tty的进程组。这种限制不允许在BSD ioctl中出现一些模糊和安全破坏的情况。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不确定这是否恰好满足了您的需求,无论如何它是:

#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;
}

答案 3 :(得分: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';