首页 > 系统相关 >Linux下非阻塞getch实现示例

Linux下非阻塞getch实现示例

时间:2023-09-04 15:31:54浏览次数:57  
标签:getch ... ch printw 示例 fcntl raw Linux


作者:fbysss
关键字:getch
问题1:标准c中没有getch函数,等待键盘输入之后,总是需要按下回车才能得到值,如何解决?
问题2:在等待键盘输入的时候,程序被阻塞了,下面的代码必须在输入处理之后才能执行。如果不使用线程,如何实现非阻塞模式?
解决办法:


#include  
  < 
  curses.h 
  > 
  
#include  
  < 
  fcntl.h 
  > 
  
 
  int 
   main()
 
  ... 
  {
    int ch;

    WINDOW * win=  initscr();              /**//* 开始curses模式  */
    scrollok(win,TRUE);                        /**//*设置屏幕可滚动,否则超出一屏之后显示不完全*/
     //raw();                              /* 禁用行缓冲   */
    keypad(stdscr, TRUE);               /**//* 开启功能键响应模式 */
    noecho();                           /**//* 当执行getch()函数的时候关闭键盘回显 */
    //fcntl(0,F_SETFL, O_NONBLOCK);//这句用于设置非阻塞模式。即在侦测键盘输入的同时,不影响getch后面语句的执行。本函数位于头文件fcntl.h中
    while(1)...{
    printw("Type any character to see it in bold ");

    ch = getch();                       /**//* 原注:如果没有调用raw()函数,必须按下enter键才可以执行下面的程序 
    实验结果表明,使用了raw()之后同样不需要回车就可以执行下去。另外,如果使用了raw(),ctrl+c也会被捕获*/

    if(ch == KEY_F(1))                  /**//* 如果没有调用keypad()初始化,将不会执行这条语句 */
    ...{
    printw("F1 Key pressed");       /**//* 如果没有使用 noecho() 函数,一些难看的控制字符将会被打印到屏幕上 */
    }
    else if(ch!=-1)
    ...{
    printw("The pressed key is ");
      attron(A_BOLD);
      printw("char:%c,intvalue:%d", ch,ch);
      attroff(A_BOLD);
    }
    refresh();                         /**//* 将缓冲区的内容打印到显示器上 */
}


     endwin();                            /**//* 结束curses模式     */
     return 0;
}

Linux下非阻塞getch实现示例_gcc


注:用gcc编译的时候要注意一点,必须加上-lcurses参数,否则会出现undefined reference to `initscr'等等一大堆错误信息

标签:getch,...,ch,printw,示例,fcntl,raw,Linux
From: https://blog.51cto.com/u_16245757/7351270

相关文章

  • linux学习 Centos 7(二)
    linux学习Centos7(二)常用的基本命令目录管理绝对路径、相对路径绝对路径路径的全称:C:\ProgramData\360safe\xxx.xx在360safe目录下,xxx.xx的相对路径就是\xxx.xxcd切换目录绝对路径:/开头相对路径:../homecd:切换目录命令cd./:当前目录cd..:返回上一级目录ls......
  • Linux 服务器下C++开发找不到mysql.h
    问题背景腾讯云服务器,linuxcentOS7内核,mysql版本5.5为宝塔腾讯云版自动安装C++用cmake编译时找不到mysql.h解决1.首先尝试yum安装mysql-devel包,但是yum让我直接下载了mariadb相关的包,下载时它,与原有包冲突bt-mysql55-5.5.62-1.el7.x86_64,但是删除原有包后mysql启动有问......
  • Linux安装IDEA
    下载idea.tar.gz(具体版本号就不写了)解压:sudotar-zxvfidea.tar.gz直接运行bin目录下的idea.sh即可:cdbinsudo./idea.sh如果有可视化界面,可以创建一个桌面图标,在桌面新建文件idea.desktop,然后输入以下内容[DesktopEntry]Version=2021.1Type=Application......
  • Linux 常用命令(持续更新)
    博客地址:https://www.cnblogs.com/zylyehuo/查看Linux命令的帮助信息1.用man手册,linux提供的帮助文档manlsmancpmanmkdir2.命令加上--help参数,查看简短帮助信息mkdir--helprm--help3.在线的搜索一些命令查询网站http://linux.51yip.com/vim编辑器的用......
  • Linux 干货整理(持续更新)
    博客地址:https://www.cnblogs.com/zylyehuo/如果虚拟机开机没有ip怎么办1.vim编辑网卡配置文件,修改如下参数[root@s25linuxtmp]#cd/etc/sysconfig/network-scripts/vim修改此文件,找到如下参数,改为yesONBOOT="yes"2.确保vmware正确选择了桥接或是NAT,且已经连接上......
  • linux宏offset_of学习随笔
    offset_of宏定义:include/linux/stddfx.h功能:给出两个参数:结构体和它的成员,获取其成员关于结构体首地址的偏移:#defineoffset_of(type,member)(unsignedlong)&((type*)0)->member这个想法挺精巧的,逐层拆开,首先看里面的(type*)0 ,这是将0地址强行转换为了一个type结构......
  • Linux下启动 jar 包的几种常见方式
    Linux下通过java命令启动jar包的几种常见方式方法一:直接启动jar包java-jarXXX.jar1缺点:当前ssh窗口会被锁定,不能再操作其他命令,如果需要执行其他命令,则需要打断进程,可按CTRL+C打断程序运行,或直接关闭窗口,程序也会退出。方法二:后台启动jar包java-jarXXX.jar&1&代表......
  • Linux日志管理经验总结(crontab+logrotate)
    Linux系统-部署-运维系列导航 日志管理目标日志的管理,一般包括两大部分日志内容,合理的日志内容(日志锚点,内容格式,等)可以为应用服务的执行记录、问题排查提供最有力的帮助日志存档规则,包括日志分割方式(按日期、按文件大小,等),日志存档数量,如只保存最近一个月,等对于自行开发的......
  • Linux开机启动方案
    Linux系统-部署-运维系列导航一.系统服务如果组件已经安装为系统服务,默认服务文件为xxx.service,存储在/usr/lib/systemd/system可以使用以下2种方式设置开机启动systemctl方式systemctlenable/disablexxx指令设置/取消开机启动--查看是否开机启动[root@localhosts......
  • Linux系统screen命令的用法
    1、https://www.cnblogs.com/watson04/p/16950232.html多窗口screen,像许多的窗口管理器一样,能支持多窗口。这个功能在处理多个任务且同时没有打开新的会话时很有用。作为一个系统管理员,我常常要同时开四五个SSH会话。在每个shell下,我可能要处理两三个任务。不使用screen的话,......