确定有多少终端是开放的
Determining how many terminals are open
我现在已经为此苦苦挣扎了大约 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 终端打开。
打开 w
or who
命令的管道并计算与您的用户相对应的条目数会更简单、更有效(也更便携)。大多数终端仿真器(甚至 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
的手册页记录了 header 和列;您的应用程序可以跳过 w
输出的 header,并检查给定用户名的第一列,同时提取第二列(用于 TTY
信息)。
打开每个 pty 设备以检查是否有其他进程打开它至少有两个问题:
- 你必须知道名字(是的,这是 system-dependent)
- 这取决于您通常可以打开同一设备两次的巧合 - 而且您不太可能打开其他用户的设备
您可以使用通过 popen
打开的 FILE
流读取 w
等简单程序的输出,例如
FILE *fp = popen("w", "r");
while (fgets(buffer, sizeof(buffer), fp) {
...process input
}
pclose(fp);
我现在已经为此苦苦挣扎了大约 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 终端打开。
打开 w
or who
命令的管道并计算与您的用户相对应的条目数会更简单、更有效(也更便携)。大多数终端仿真器(甚至 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
的手册页记录了 header 和列;您的应用程序可以跳过 w
输出的 header,并检查给定用户名的第一列,同时提取第二列(用于 TTY
信息)。
打开每个 pty 设备以检查是否有其他进程打开它至少有两个问题:
- 你必须知道名字(是的,这是 system-dependent)
- 这取决于您通常可以打开同一设备两次的巧合 - 而且您不太可能打开其他用户的设备
您可以使用通过 popen
打开的 FILE
流读取 w
等简单程序的输出,例如
FILE *fp = popen("w", "r");
while (fgets(buffer, sizeof(buffer), fp) {
...process input
}
pclose(fp);