一. 前言
我们在学习C语言的时候,getchar都是阻塞的,等待用户输入字符并且输入回车后才返回。但是有时候我们希望把getchar设置为非阻塞,或者说,当我们遇到getchar函数变成非阻塞的了,我们应该怎么解决这个问题,例如,login进程(会调用getchar函数)不等你输入用户名了,直接返回了,等等。
二. getchar设置为非阻塞的方法
getchar函数的实现大致如下:
int getchar(void) {
char c;
ssize_t bytesRead = read(STDIN_FILENO, &c, sizeof(char));
if (bytesRead == -1) {
// 读取错误
return EOF;
} else if (bytesRead == 0) {
// 读取结束
return EOF;
} else {
// 返回读取的字符
return (int)c;
}
}
可以看到,getchar是调用了read函数的,从stdin标准输入中获取内容。所以,问题就很简单了,我们只要把标准输入设置为非阻塞就好了。
我们知道,在嵌入式中,init进程要做的一个工作就是打开终端设备,其中,把终端设置为非阻塞就可以了,如下:
open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NONBLOCK)
这样,当init进程启动login进程时,login进程会调用getchar,此时就会出现启动login进程,login进程不等待输入用户名密码直接返回的情况。
三. 总结
getchar函数内部其实会调用read函数,如果需要把getchar设置为非阻塞的形式,就需要在打开终端的时候,把终端设置为非阻塞模式。