linux下实现getch()函数的功能,Linux下实现getch()函数功能
学习c语言之初,我在写一些小程序时常会用到getch()函数,用以达到暂停程序或按任意键继续的效果。但是getch()函数并非c标准函数,故在Linux系统中想要实现getch()函数的功能需要自己进行编写。
首先需要清楚的是c标准库中的getchar()函数和getch()函数的区别。
getchar()函数,是从键盘缓冲区中读取一个字符,遇到回车键时返回该字符的ASCII码,若出错返回-1;
getch()函数,是直接从键盘接收一个字符,并立即返回该字符的ASCII码,执行getch()函数时输入的字符时不会在终端回显。
实现getch()函数功能的主要思路就是,在输入之前把终端的属性初始化,设置为原始模式,该模式下所有的输入数据以字节为单位被处理。在原始模式下,终端是不可回显的,而且所有特定的终端输入/输出模式不可用。在输入完毕之后,将终端属性再设置回原来的模式,然后返回接收的字符即可。
要实现对终端属性的改变需要用到tcgetattr()和tcsetattr()两个函数,其中tcgetattr()函数用于获取当前终端的属性,tcsetattr函数用于将终端设置为参数中结构体指定的属性。(这两个函数的详细用法此处不介绍,请自行查询)。
以下为实现getch()函数功能的代码
#include
char getch(void)
{
struct termios tmtemp,tm;
char c;
int fd=0;
if(tcgetattr(fd,&tm) != 0){ /*获取当前的终端属性设置,并保存到tm结构体中*/
return -1;
}
tmtemp=tm;
cfmakeraw(&tmtemp); /*将tetemp初始化为终端原始模式的属性设置*/
if(tcsetattr(fd,TCSANOW,&tmtemp) != 0){ /*将终端设置为原始模式的设置*/
return -1;
}
c=getchar();
if(tcsetattr(fd,TCSANOW,&tm) != 0){ /*接收字符完毕后将终端设置回原来的属性*/
return 0;
}
return c;
}
linux下实现getch()函数的功能,Linux下实现getch()函数功能相关推荐
- linux进程snprintf函数功能,linux 之 snprintf函数用法
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
- linux用Lseek函数 拷贝文件,linux系统下lseek函数的详细用法
前面的文章里面,仔细讲了在linux系统对文件的读写操作以及文件管理,为今天要讲的内容作了铺垫(如果您是刚接触这方面的内容,可以先看我之前写的文章,有错误的地方,还望指出来,在这里先说一声谢谢).好了 ...
- linux 创建线程函数吗,[笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include #define CreateThreadEx(tid,threadFun,args) ...
- linux下 为自己编写的程序 添加tab自动补全 功能
linux下 为自己编写的程序 添加tab自动补全功能 入门 complete 在我的tmp下随便写了一个a.sh, 为他补全 edit /etc/bash_completion.d/foo _foo ...
- linux下软件发布,Linux Kernel 5.12发布下载,附新特性及新功能介绍
Linus Torvalds在Linux内核邮件列表中宣布正式发布Linux Kernel 5.12版本,已提供linux-5.12.tar.xz/tar.gz下载,以下为你介绍该版本的更改.新特性及 ...
- 让你费解的函数原型:Linux下的signa函数
signal函数用于向系统注册处理某一信号的函数,说白了,就是告诉系统:当某个信号发生了,执行这个函数.当signal被调用时,它返回调用前处理同意信号的函数的指针. 在signal.h头文件中,它的 ...
- linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...
信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...
- linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...
一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...
- Linux Rootkit 系列三:实例详解 Rootkit 必备的基本功能
本文所需的完整代码位于笔者的代码仓库:https://github.com/NoviceLive/research-rootkit. 测试建议: 不要在物理机测试!不要在物理机测试! 不要在物理机测试 ...
- linux内核7大功能,Linux Kernel5.10十个值得关注的功能
Linux Kernel 5.10 有望在本周末发布,外媒 Phoronix 盘点了 10 个值得关注的改进和新功能.5.10 不仅是 2020 年最后一个内核版本,而且还是长期支持(LTS)版本. ...
最新文章
- Git学习系列之Git基本操作提交项目(图文详解)
- 李铁:《非诚勿扰》与虚弱的中国人——写的太好了
- 如何查看 el-form-item 的prop属性_PHP 7.4中的类型属性(Typed Properties)
- qt中socket通信流程图_使用QT实现简单的tcp/ip通信
- python学习笔记9-函数1
- Hadoop 使用FileSystem API 读取数据
- Java Web App体系结构
- 识别图片噪声干扰_射频相位噪声介绍
- 最新升学e网通JS逆向分析
- r语言 index_基于R语言绘制BBC风格图表
- UITableView上的iOS UIRefreshControl
- *学生管理系统java面向对象版本
- Mac OS X 10.7.x Lion下添加离线词典
- 在线html解压,javascript实现网页端解压并查看zip文件
- webstrom无法格式化局部html,格式化代码失效webstorm
- 不良资产证券化之后,谁来买单?
- win10任务栏假死状态 无法操作
- 怎么关闭苹果Mac桌面出现麦克风图案?
- 2021最新微信域名链接检测工具 微信域名拦截检测接口
- Android 加载pdf文件