Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terminal 确定打开了多少终端_Terminal_Gnome - Fatal编程技术网

Terminal 确定打开了多少终端

Terminal 确定打开了多少终端,terminal,gnome,Terminal,Gnome,我已经为此挣扎了大约8个小时了。我需要写一段C代码来确定当前打开了多少终端。在代码运行之前,用户已经打开了这些终端。我知道让代码在运行时创建gnome终端会容易得多,但是,这不是一个开放的过程。我需要遍历所有可能的终端缓冲区文件,确定当前正在使用哪些文件,并将文件描述符分配给那些已经打开的文件。这就是我目前所拥有的 for(i=0; i<26; i++) { sprintf(termPath, "/dev/pts/%d", i); term = open(termPath

我已经为此挣扎了大约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);
}

对于(i=0;i而言,打开通向or命令的管道并计算与用户对应的条目数将更简单、更有效(以及更便携)。大多数终端模拟器(甚至gnome终端)都会更新这些命令使用的
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
输出的标题,并检查第一列中的给定用户名,同时提取第二列(用于
TTY
信息)

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

  • 您必须知道名称(是的,这取决于系统)
  • 这取决于你通常可以打开同一台设备两次,而你不太可能打开其他用户的设备这一巧合
您可以使用通过打开的
文件
流读取简单程序(如
w
)的输出,例如


好的,所以我需要使用系统(“who”)。然后呢?我需要以某种方式从中获取终端缓冲区编号。
FILE *fp = popen("w", "r");
while (fgets(buffer, sizeof(buffer), fp) {
    ...process input
}
pclose(fp);