• getchar函数设置为非阻塞


    一. 前言

            我们在学习C语言的时候,getchar都是阻塞的,等待用户输入字符并且输入回车后才返回。但是有时候我们希望把getchar设置为非阻塞,或者说,当我们遇到getchar函数变成非阻塞的了,我们应该怎么解决这个问题,例如,login进程(会调用getchar函数)不等你输入用户名了,直接返回了,等等。

    二. getchar设置为非阻塞的方法

            getchar函数的实现大致如下:

    1. int getchar(void) {
    2. char c;
    3. ssize_t bytesRead = read(STDIN_FILENO, &c, sizeof(char));
    4. if (bytesRead == -1) {
    5. // 读取错误
    6. return EOF;
    7. } else if (bytesRead == 0) {
    8. // 读取结束
    9. return EOF;
    10. } else {
    11. // 返回读取的字符
    12. return (int)c;
    13. }
    14. }

            可以看到,getchar是调用了read函数的,从stdin标准输入中获取内容。所以,问题就很简单了,我们只要把标准输入设置为非阻塞就好了。

            我们知道,在嵌入式中,init进程要做的一个工作就是打开终端设备,其中,把终端设置为非阻塞就可以了,如下:

    open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NONBLOCK)

            这样,当init进程启动login进程时,login进程会调用getchar,此时就会出现启动login进程,login进程不等待输入用户名密码直接返回的情况。

    三. 总结

            getchar函数内部其实会调用read函数,如果需要把getchar设置为非阻塞的形式,就需要在打开终端的时候,把终端设置为非阻塞模式。

  • 相关阅读:
    Javascript 代码规范
    蓝禾,三七互娱,顺丰,康冠科技,金证科技24春招内推
    AWS Lambda从入门到精通
    C++goto语句
    每日一句 代码
    k8s集群calio网络问题
    计算机基础(1)——Verilog语法入门
    使用mybatis plus自定义拦截器,实现数据权限
    spacemacs auto-complete 自动补全功能
    react 笔记
  • 原文地址:https://blog.csdn.net/to_be_better_wen/article/details/133279975