【问题标题】:Determining how many terminals are open确定打开的终端数量
【发布时间】:2015-04-30 08:14:21
【问题描述】:

我已经为此苦苦挣扎了大约 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 终端打开。

【问题讨论】:

    标签: terminal gnome


    【解决方案1】:

    打开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 打开的FILE 流读取简单程序的输出,例如w,例如,

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

    【讨论】:

    • 好的,所以我需要使用 system("who")。然后怎样呢?我需要以某种方式从中获取终端缓冲区号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2018-06-08
    • 2021-02-27
    • 2016-05-28
    • 2023-01-03
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多