视觉传播设计与制作百度上做优化一年多少钱
一. 前言
我们在学习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设置为非阻塞的形式,就需要在打开终端的时候,把终端设置为非阻塞模式。