方式一:利用select监控键盘文件/dev/tty
读取键盘文件“/dev/tty”的数据,其执行流程如下:
首先,打开键盘文件 fd = open("/dev/tty", O_RDONLY | O_NONB);
其次,利用select监控键盘文件的读状态 ret = select(fd, &fdsetR, NULL, NULL, timeout);
然后,利用read读取内容 read(fd, &buff, len);
测试代码如下:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
int main()
{
int keyboard;
int ret;
ssize_t i;
char buff[32];
fd_set readfd;
struct timeval timeout;
keyboard = open("/dev/tty", O_RDONLY | O_NONBLOCK);
assert(keyboard > 0);
while(1)
{
timeout.tv_sec = 5;
timeout.tv_usec = 0;
FD_ZERO(&readfd);
FD_SET(keyboard, &readfd);
ret = select(keyboard + 1, &readfd, NULL, NULL, &timeout);
if (ret == -1)
perror("select error");
else if (ret)
{
if (FD_ISSET(keyboard, &readfd))
{
i = read(keyboard, buff, 31);
buff[i]='\0';
printf("the input is %s\n", buff);
if (strncmp("exit", buff, 4) == 0)
break;
}
}
else if (ret == 0)
{
printf("time out\n");
}
}
return 0;
}
方式二:利用预定义的文件描述符STDIN_FILENO
STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。 定义文件\include\unistd.h中,明确说明了是文件描述符 /* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */ 对其用法,在博客《Linux中的STDIN_FILENO和STDOUT_FILENO》存在实例代码
方式三:利用stdin
stdin等是FILE *类型,属于标准I/O
对于还存在的其他方式,希望大家指出,补充。