linux常用输入函数scanf和fgets通常都是阻塞式的:

  1、如果用户没有输入,则程序会阻塞等待用户输入输入内容后,且需要用户点回车键才能完成读取键盘输入。

  2、用户输入的信息,会在屏幕上显示出来。

一、以下代码实现了:

  1、用户没有输入,则在设定时间过后,程序会继续运行下去

  2、用户输入信息不会在屏幕上显示出来

  3、程序能够不等待回车,直接响应键盘输入

  4、用到了system函数,会启动子进程(缺点)。

  5、此种方法是使用stty命令,设置终端输入为禁止回显并忽略回车符来实现的。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4
 5 #define TTY_PATH            "/dev/tty"
 6 #define STTY_US             "stty raw -echo -F "
 7 #define STTY_DEF            "stty -raw echo -F "
 8
 9 #define UNUSED_PARAMTER(X)    (void)(X)
10
11 static char get_char( void )
12 {
13     fd_set rfds;
14     struct timeval tv;
15     char input_char = 0;
16
17     FD_ZERO(&rfds);
18     FD_SET(0, &rfds);
19
20     /**
21      * Set wait time
22      */
23     //tv.tv_sec = 0;    //seconds
24     //tv.tv_usec = 500;  //microseconds
25
26     /*Check for keyboard input.*/
27     if (select(1, &rfds, NULL, NULL, &tv) > 0)
28         input_char = getchar();
29
30     return input_char;
31 }
32
33 char nonblocking_input( void )
34 {
35     char input_char;
36
37     system(STTY_US TTY_PATH);     //Prohibit echoing,ignoring carriage returns
38
39     usleep(100);
40     input_char = get_char();
41
42     system(STTY_DEF TTY_PATH);    //Turn on echo and don't ignore carriage return
43
44     return input_char;
45 }
46
47 int main(int argc, char **argv)
48 {
49     UNUSED_PARAMTER(argc);
50     UNUSED_PARAMTER(argv);
51
52     char input_char;
53
54     input_char = nonblocking_input();
55
56    printf("\n\tYour input is %c!\n", input_char);
57    printf("\nApplication finish.\n\n");
58
59    return 0;
60 }    

nonblocking.c

二、另外一种方法,相对于第一种方法,改进点主要有:

  1、使用tcgetattr函数和tcsetattr函数代替system函数,减少子进程启动数量。

  2、此种实现是通过termios来实现的,termios的实现中,有大量的参数设置,还有伪终端的说法。

代码如下:

 1 #include <stdio.h>
 2 #include <fcntl.h>
 3 #include <termios.h>
 4 #include <unistd.h>
 5
 6 #define UNUSED_PARAMTER(X)    (void)(X)
 7
 8 char nonblocking_input(void)
 9 {
10     char input_ch;
11     struct termios newt, oldt;
12
13     int tty = open("/dev/tty", O_RDONLY);    //Open control terminal
14
15     tcgetattr(tty, &oldt);            //Get terminal properties
16     newt = oldt;
17
18     //Set characters are not buffered(~ICANON) and do not echo(~ECHO).
19     //You can also choose only one of them.
20     newt.c_lflag &= ~( ICANON | ECHO );
21     tcsetattr(tty, TCSANOW, &newt);
22
23     read(tty, &input_ch, 1);
24     tcsetattr(tty, TCSANOW, &oldt);        //Restore terminal properties
25
26     return input_ch;
27 }
28
29 int main(int argc, char **argv)
30 {
31     UNUSED_PARAMTER(argc);
32     UNUSED_PARAMTER(argv);
33
34     char input_char;
35
36     input_char = nonblocking_input();
37
38     printf("\n\tYour input is %c!\n", input_char);
39     printf("\nApplication finish.\n\n");
40
41     return 0;
42 }  

nonblocking_inout.c

转载于:https://www.cnblogs.com/zhengzhuo-272/p/8598069.html

Linux下无需按下回车(无阻塞)读取输入键值相关推荐

  1. Linux驱动编程 step-by-step (八) 阻塞型字符设备驱动

    阻塞型字符设备驱动 前面说到了 如何实现read write 等操作,但如果设备缓冲已满,现在想而用户此时又想写入设备,此请求就无法立即执行,那怎么办呢? 第一种情况是:驱动程序想用户返回请求失败的信 ...

  2. 无阻塞实时检测键盘输入

    本人小白一枚,第一次写博客,个位大佬多多指教. 之前一直使用opencv,里面的waitkey函数对于实时检测键盘输入还是比较友好.但是最近只用c++开发之后发现不会怎么实现无阻塞读取键盘输入.查资料 ...

  3. WPF MVVM模式下的无阻塞刷新

    MVVM模式下的无阻塞刷新的两种方法: //传统模式下的无刷新调用(主线程开新线程,新线程又调用主线程来更新UI) //第1步先在线程内部计算出需要绑定的数据 //第2步然后再使用Invoke/Beg ...

  4. 【如何在linux环境下排查生产环境java线程阻塞问题】

    如何在linux环境排查生产环境java线程阻塞问题 开胃小菜 进入主题,这里以我自己的服务器为例子 开胃小菜 在进入主题前我们先看一下windows的一个小命令 注:在本地有java环境开启的时候执 ...

  5. Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)

    1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...

  6. Linux学习笔记010---CentOS7下安装FTP服务

    JAVA技术交流QQ群:170933152 按照这个就可以 1.安装vsftp 1.1.安装vsftp,测试安装的vsftpd的版本是:vsftpd.x86_64 0:3.0.2-11.el7_2 y ...

  7. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  8. Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问

    Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180 ...

  9. linux es连接mysql_LINUX下使用elasticsearch-jdbc工具实现MySQL同步到ElasticSearch 以及linux 64位centos系统安装jdk1.8...

    第一步:环境匹配 1)elasticsearch 2.3.3 成功安装部署 2)mysql安装成功,增删改查无误~~. 3)要保证elasticsearch-jdbc的版本要与elasticsearc ...

最新文章

  1. viewPager开启界面导航之旅
  2. 想聊天?自己搭建个聊天机器人吧!
  3. AirPrint: 无交互的后台打印实现(Print without UI,iOS8+)
  4. make zImage和make uImage的区别和mkimage工具的使用
  5. python将文本中的数据处理成图像(matplotlib)
  6. 前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例 1
  7. 学科前沿技术专题第六章
  8. pandas 的数据结构Series与DataFrame
  9. Java递归算法求n的阶乘
  10. 常用win10优化工具(后续继续更新)
  11. 基于51单片机的简易数字示波器proteus仿真
  12. 侧方位停车技巧图解 教你快速便捷停车(图)
  13. 腾讯云轻量服务器和虚拟主机有什么区别?
  14. 第19届亚太零售商大会 | 奇点云CEO行在受邀出席发表演讲
  15. 电脑蓝屏代码大全及解决办法合集
  16. Python 基于BP神经网络的鸢尾花分类
  17. Python的基本语法(十一)(持续更新)
  18. flash读写导致死机问题分析
  19. 【AcWing】AcWing 2. 01背包问题
  20. AttributeError: Layer my_model has no inbound nodes.

热门文章

  1. 基于linux实现DNS互联网的搭建
  2. {ubuntu}不能挂载windows
  3. 精益 React 学习指南 (Lean React)- 4.1 react 代码规范
  4. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析
  5. JSF 与 HTML 标签的联系
  6. 如何在重装SAV10.1/SCS3.1服务器后继续管理原来的客户端
  7. python创建画布与子图_python实现在一个画布上画多个子图
  8. mysql 5.7 单节点多实例_mysql5.7 多实例(第二篇)从节点数据异常
  9. JavaScript清空数组的三种方法
  10. java db 使用_JavaDB的基本使用