如何使用c检查哪些终端是打开的

时间:2016-04-25 03:31:34

标签: c terminal

我正在尝试使用C检查哪些终端是打开的。当我在终端中键入“w”时,它显示只有4个终端打开(实际上我打开了多少个终端)。但是,当我运行此代码时,它告诉我大约有20个打开。我该如何解决这个问题?

#include <stdlib.h>
#include <stdio.h> 
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <time.h>


const char pts[] = "/dev/pts/";
int s1=0;

FILE *fp = NULL;
char *terminal[4];
char* check;

int main(int argc, char *argv[]){

int i;
char strDev[100]; 

for(i=0; i<100; i++){
  sprintf(strDev, "%s%d", pts, i);
  printf("Opening %s...\n", strDev); fflush(stdout);

  if((fp = fopen(strDev, "w")) == NULL) ;
  else{

  printf("\tOpened %s\n", strDev); fflush(stdout);

    terminal[s1] = strDev;
    s1++;
  }
}
return 0;
}

2 个答案:

答案 0 :(得分:1)

正常运行w。但只需要计数,而不是标题。标题通常的第一行是一个状态行,给出了实际的用户数(但在C中解析很难),标题的剩余行显示列名,从第一列开始。 w或其格式有 标准。 POSIX确实描述了who,但避免描述它使用的格式。所以,对于w

#include <stdio.h>
int
main(void)
{
    int result = 0;
    FILE *fp;
    if ((fp = popen("w", "r")) != 0) {
        int lineno = 0;
        char *buffer = 0;
        size_t size = 0;
        int head = 0;
        while (getline(&buffer, &size, fp) > 0) {
            if (lineno++ == 0) {
                head = (*buffer != ' ') ? 2 : 1;
            } else if (head++ > 1) {
                ++result;
            }
        }
        pclose(fp);
    }
    printf("%d terminals are open\n", result);
    return 0;
}

如果您想知道哪些终端正在使用,那么这样做的方法是使用标题中的列信息并从以下行中选择文本。由于没有适用的标准,列的宽度(和顺序)可能因系统而异,因此使用特定偏移和字符串长度的任何解决方案都将存在缺陷。

但是,为了显示可用(未使用)终端的列表,您可以独立使用,因为在某些系统上,相应的特殊设备将受到保护,以便普通(非特权)程序无法打开它们,只测试它们存在。

答案 1 :(得分:0)

为什么不使用system命令来执行您正在使用的w命令:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {

    char command[128];
    snprintf(command, sizeof(command), "w");
    system(command);

return 0;
}