getchar函数设置为非阻塞

一. 前言

        我们在学习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设置为非阻塞的形式,就需要在打开终端的时候,把终端设置为非阻塞模式。

你可能感兴趣的:(C语言学习,linux,C语言)