确定打开多少终端

时间:2015-04-30 08:14:21

标签: terminal gnome

我现在已经挣扎了大约8个小时。我需要编写一段C代码来确定当前打开的终端数量。用户在代码运行之前打开了这些终端。我知道在运行时让代码创建gnome终端要容易得多,但是,这不是开放的。我需要通过循环遍历所有可能的终端缓冲区文件来确定当前正在使用哪些文件,并将文件描述符分配给已经打开的文件描述符。这是我到目前为止所做的。

for(i=0; i<26; i++)
{
    sprintf(termPath, "/dev/pts/%d", i); 
    term = open(termPath, O_RDWR);
    fprintf(term, "Term %d: %d\n", i, term);
}

这里有什么问题?我目前将/ dev / pts / 0,/ dev / pts / 11和/ dev / pts / 17打开为gnome终端。

1 个答案:

答案 0 :(得分:0)

打开wwho命令的管道并计算与您的用户对应的条目数会更简单,更有效(也更便于移植)。大多数终端仿真器(甚至是gnome-terminal)都会更新这些命令使用的utmp信息。

此列表显示w的输出类型:

~ (101) w
 05:08:14 up  1:04,  5 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
tom      pts/1    thathost:S.0     04:44   43.00s  0.61s  0.50s ssh -X michener
tom      pts/2    thathost:S.1     04:45   22:21   0.11s  0.11s -bin/tcsh
tom      pts/3    thathost:S.3     05:05    1:08   0.11s  0.07s ded /usr/build/
tom      pts/4    thathost:S.2     04:46   21:09   0.90s  0.87s vile
tom      pts/5    thathost:S.4     05:08    0.00s  0.03s  0.00s w

w的手册页记录了标题和列;您的应用程序可以跳过w输出的标题,并检查给定用户名的第一列,同时提取第二列(对于TTY信息)。

打开每个pty设备以检查是否有其他进程已打开它至少有两个问题:

  • 你必须知道名字(是的,这是系统依赖的)
  • 这取决于您通常可以两次打开同一设备的巧合 - 并且您不太可能打开其他用户的设备

您可以使用通过popen打开的w信息流来阅读简单程序的输出,例如FILE,例如,

FILE *fp = popen("w", "r");
while (fgets(buffer, sizeof(buffer), fp) {
    ...process input
}
pclose(fp);