如何在“top”linux命令中执行控制台input?

所以,linux的top命令有一个真正的类似于控制台输出的循环(没什么奇怪的),但是它使用非阻塞的控制台input,它不会在命令行显示input的字符。 它是如何完成的? 有没有图书馆,他们使用线程? 我需要写一个相同的风格(通过SSH使用)的Linux应用程序,我不知道如何做这个input(单独的线程中的cin不是解决scheme, top使用其他的东西)。

一个解决方案是使用curses的实现。

我不知道这是怎么回事

另一个选项,不使用curses:

 #include <stdio.h> //#include <unistd.h> #include <termios.h> //#include <sys/ioctl.h> //#include <sys/time.h> //#include <sys/types.h> #include <fcntl.h> //------------------------------------------------------------------------------ // getkey() returns the next char in the stdin buffer if available, otherwise // it returns -1 immediately. // int getkey(void) { char ch; int error; struct termios oldAttr, newAttr; int oldFlags, newFlags; struct timeval tv; int fd = fileno(stdin); tcgetattr(fd, &oldAttr); newAttr = oldAttr; oldFlags = fcntl(fd, F_GETFL, 0); newAttr.c_iflag = 0; /* input mode */ newAttr.c_oflag = 0; /* output mode */ newAttr.c_lflag &= ~ICANON; /* line settings */ newAttr.c_cc[VMIN] = 1; /* minimum chars to wait for */ newAttr.c_cc[VTIME] = 1; /* minimum wait time */ // Set stdin to nonblocking, noncanonical input fcntl(fd, F_SETFL, O_NONBLOCK); error=tcsetattr(fd, TCSANOW, &newAttr); tv.tv_sec = 0; tv.tv_usec = 10000; // small 0.01 msec delay select(1, NULL, NULL, NULL, &tv); if (error == 0) error=(read(fd, &ch, 1) != 1); // get char from stdin // Restore original settings error |= tcsetattr(fd, TCSANOW, &oldAttr); fcntl(fd, F_SETFL, oldFlags); return (error ? -1 : (int) ch); } int main() { int c,n=0; printf("Hello, world!\nPress any key to exit. I'll wait for 4 keypresses.\n\n"); while (n<4) { //printf("."); // uncomment this to print a dot on each loop iteration c = getkey(); if (c >= 0) { printf("You pressed '%c'\n", c); ++n; } } } 

对不起,我不能完全相信这一点,因为我在多年前就把它从网上剥离了下来。 我想我已经调整了一些,但是从我得到的地方来看,大部分情况并没有改变。 不幸的是,我没有添加评论,指出我在哪里找到它。