学习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()函数功能相关推荐

  1. linux进程snprintf函数功能,linux 之 snprintf函数用法

    int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...

  2. linux用Lseek函数 拷贝文件,linux系统下lseek函数的详细用法

    前面的文章里面,仔细讲了在linux系统对文件的读写操作以及文件管理,为今天要讲的内容作了铺垫(如果您是刚接触这方面的内容,可以先看我之前写的文章,有错误的地方,还望指出来,在这里先说一声谢谢).好了 ...

  3. linux 创建线程函数吗,[笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include #define CreateThreadEx(tid,threadFun,args) ...

  4. linux下 为自己编写的程序 添加tab自动补全 功能

    linux下 为自己编写的程序 添加tab自动补全功能 入门 complete 在我的tmp下随便写了一个a.sh, 为他补全 edit /etc/bash_completion.d/foo _foo ...

  5. linux下软件发布,Linux Kernel 5.12发布下载,附新特性及新功能介绍

    Linus Torvalds在Linux内核邮件列表中宣布正式发布Linux Kernel 5.12版本,已提供linux-5.12.tar.xz/tar.gz下载,以下为你介绍该版本的更改.新特性及 ...

  6. 让你费解的函数原型:Linux下的signa函数

    signal函数用于向系统注册处理某一信号的函数,说白了,就是告诉系统:当某个信号发生了,执行这个函数.当signal被调用时,它返回调用前处理同意信号的函数的指针. 在signal.h头文件中,它的 ...

  7. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  8. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  9. Linux Rootkit 系列三:实例详解 Rootkit 必备的基本功能

    本文所需的完整代码位于笔者的代码仓库:https://github.com/NoviceLive/research-rootkit. 测试建议: 不要在物理机测试!不要在物理机测试! 不要在物理机测试 ...

  10. linux内核7大功能,Linux Kernel5.10十个值得关注的功能

    Linux Kernel 5.10 有望在本周末发布,外媒 Phoronix 盘点了 10 个值得关注的改进和新功能.5.10 不仅是 2020 年最后一个内核版本,而且还是长期支持(LTS)版本. ...

最新文章

  1. Git学习系列之Git基本操作提交项目(图文详解)
  2. 李铁:《非诚勿扰》与虚弱的中国人——写的太好了
  3. 如何查看 el-form-item 的prop属性_PHP 7.4中的类型属性(Typed Properties)
  4. qt中socket通信流程图_使用QT实现简单的tcp/ip通信
  5. python学习笔记9-函数1
  6. Hadoop 使用FileSystem API 读取数据
  7. Java Web App体系结构
  8. 识别图片噪声干扰_射频相位噪声介绍
  9. 最新升学e网通JS逆向分析
  10. r语言 index_基于R语言绘制BBC风格图表
  11. UITableView上的iOS UIRefreshControl
  12. *学生管理系统java面向对象版本
  13. Mac OS X 10.7.x Lion下添加离线词典
  14. 在线html解压,javascript实现网页端解压并查看zip文件
  15. webstrom无法格式化局部html,格式化代码失效webstorm
  16. 不良资产证券化之后,谁来买单?
  17. win10任务栏假死状态 无法操作
  18. 怎么关闭苹果Mac桌面出现麦克风图案?
  19. 2021最新微信域名链接检测工具 微信域名拦截检测接口
  20. Android 加载pdf文件

热门文章

  1. 100-网络编程——第五章流式套接字
  2. xware for linux,Ubuntu 14.04安装迅雷Xware过程笔记
  3. 数字图像处理概述PPT学习1
  4. 没项目经验,这7个前端项目让你脱颖而出
  5. JSON字符串,JSON对象的相互转换
  6. 使用python爬取行政区划
  7. 与孩子一起学编程14章
  8. 不要上网更新计算机系统的补丁程序,360安全卫士更新补丁后系统不能联网怎么办...
  9. VScode中SVN插件详细配置【官网】
  10. 分子动力学模拟-gromacs的基本使用