所以我有一个tty(让我们说/ dev / tty5)并且想要知道它当前是否是进程组或会话的控制tty,或者它是否当前是无主的。 POSIX有两个API函数,它们在这里建议:tcgetpgrp()和tcgetsid(),这两个函数只有在调用者将tty作为控制tty的情况下才有效 - 在这种情况下,它们使得它们几乎无用(实际上我不是t看到tcgetsid()的重点。
任何人都有一个建议我如何能够以一种理智的方式从C中检测终端当前是否是一个进程的控制终端?我只关心Linux,所以如果需要特定于Linux的API,那对我来说没问题。
答案 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';