Linux下无需按下回车(无阻塞)读取输入键值
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下无需按下回车(无阻塞)读取输入键值相关推荐
- Linux驱动编程 step-by-step (八) 阻塞型字符设备驱动
阻塞型字符设备驱动 前面说到了 如何实现read write 等操作,但如果设备缓冲已满,现在想而用户此时又想写入设备,此请求就无法立即执行,那怎么办呢? 第一种情况是:驱动程序想用户返回请求失败的信 ...
- 无阻塞实时检测键盘输入
本人小白一枚,第一次写博客,个位大佬多多指教. 之前一直使用opencv,里面的waitkey函数对于实时检测键盘输入还是比较友好.但是最近只用c++开发之后发现不会怎么实现无阻塞读取键盘输入.查资料 ...
- WPF MVVM模式下的无阻塞刷新
MVVM模式下的无阻塞刷新的两种方法: //传统模式下的无刷新调用(主线程开新线程,新线程又调用主线程来更新UI) //第1步先在线程内部计算出需要绑定的数据 //第2步然后再使用Invoke/Beg ...
- 【如何在linux环境下排查生产环境java线程阻塞问题】
如何在linux环境排查生产环境java线程阻塞问题 开胃小菜 进入主题,这里以我自己的服务器为例子 开胃小菜 在进入主题前我们先看一下windows的一个小命令 注:在本地有java环境开启的时候执 ...
- Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi(跨平台)
1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有 ...
- Linux学习笔记010---CentOS7下安装FTP服务
JAVA技术交流QQ群:170933152 按照这个就可以 1.安装vsftp 1.1.安装vsftp,测试安装的vsftpd的版本是:vsftpd.x86_64 0:3.0.2-11.el7_2 y ...
- Linux中/proc目录下文件详解
Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...
- Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问
Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180 ...
- linux es连接mysql_LINUX下使用elasticsearch-jdbc工具实现MySQL同步到ElasticSearch 以及linux 64位centos系统安装jdk1.8...
第一步:环境匹配 1)elasticsearch 2.3.3 成功安装部署 2)mysql安装成功,增删改查无误~~. 3)要保证elasticsearch-jdbc的版本要与elasticsearc ...
最新文章
- viewPager开启界面导航之旅
- 想聊天?自己搭建个聊天机器人吧!
- AirPrint: 无交互的后台打印实现(Print without UI,iOS8+)
- make zImage和make uImage的区别和mkimage工具的使用
- python将文本中的数据处理成图像(matplotlib)
- 前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例 1
- 学科前沿技术专题第六章
- pandas 的数据结构Series与DataFrame
- Java递归算法求n的阶乘
- 常用win10优化工具(后续继续更新)
- 基于51单片机的简易数字示波器proteus仿真
- 侧方位停车技巧图解 教你快速便捷停车(图)
- 腾讯云轻量服务器和虚拟主机有什么区别?
- 第19届亚太零售商大会 | 奇点云CEO行在受邀出席发表演讲
- 电脑蓝屏代码大全及解决办法合集
- Python 基于BP神经网络的鸢尾花分类
- Python的基本语法(十一)(持续更新)
- flash读写导致死机问题分析
- 【AcWing】AcWing 2. 01背包问题
- AttributeError: Layer my_model has no inbound nodes.
热门文章
- 基于linux实现DNS互联网的搭建
- {ubuntu}不能挂载windows
- 精益 React 学习指南 (Lean React)- 4.1 react 代码规范
- SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析
- JSF 与 HTML 标签的联系
- 如何在重装SAV10.1/SCS3.1服务器后继续管理原来的客户端
- python创建画布与子图_python实现在一个画布上画多个子图
- mysql 5.7 单节点多实例_mysql5.7 多实例(第二篇)从节点数据异常
- JavaScript清空数组的三种方法
- java db 使用_JavaDB的基本使用