我正在尝试使用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;
}
答案 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;
}