下面的代码是一个非阻塞读取terminal
IO 的示例,但是当我在控制台上键入一个字符时,它不会立即将其打印出来。Perpaps你会说我应该设置stty -icanon
,所以规范模式被禁用,这确实有效,但我认为即使我stty icanon
不禁用,终端的非阻塞读取是character-oriented
,cannonical
模式只是唤醒阻塞进程,但我的进程没有阻塞,如果我们输入一个字符,那么 fd 是可读的,所以它应该立即打印出这个字符。
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#define MSG_TRY "try again\n"
int main(void)
{
char buf[10];
int fd, n;
fd = open("/dev/tty", O_RDONLY|O_NONBLOCK);
if(fd<0) {
perror("open /dev/tty");
exit(1);
}
tryagain:
n = read(fd, buf, 10);
if (n < 0) {
if (errno == EAGAIN) {
sleep(1);
write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
goto tryagain;
}
perror("read /dev/tty");
exit(1);
}
write(STDOUT_FILENO, buf, n);
close(fd);
return 0;
}