linux下模拟按键kbhit(),检测按键终止while(1)死循环

如何通过另外一个事件来控制while循环以及在必要的时候使用按键控制while死循环

1、设置一个循环标志。主进程中进行循环并且在每次循环中检查循环标志决定是否继续,线程中检测按键输入后改变该标志

2、主进程中进行按键检测,线程用于循环操作,主进程检测到按键后关闭循环线程

3、在循环中对键盘缓冲区进行扫描,用于判断是否有按键信息

这里我们不使用多线程的机制,直接来检测按键的信息来控制while循环,在有按键按下的时候终止while循环,即在扫描按键的时候不阻塞while循环事件。不废话直接上代码。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <termios.h>
#include <termio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <regex.h>
#include <sys/time.h>

using namespace std;
static struct termio term_orig;
static int kbdflgs;
<span style="color: rgb(0, 130, 0); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 13.63636302947998px; line-height: 15.397727012634277px; white-space: nowrap;">/* 判断是否有按键按下 */</span>
int kbhit(void)
{
	struct timeval tv;
	struct termios old_termios, new_termios;
	int error;
	int count = 0;
	tcgetattr(0, &old_termios);
	new_termios = old_termios;
	new_termios.c_lflag &= ~ICANON;
	new_termios.c_lflag &= ~ECHO;
	new_termios.c_cc[VMIN] = 1;
	new_termios.c_cc[VTIME] = 0;
	error = tcsetattr(0, TCSANOW, &new_termios);
	tv.tv_sec = 0;
	tv.tv_usec = 100;
	select(1, NULL, NULL, NULL, &tv);
	error += ioctl(0, FIONREAD, &count);
	error += tcsetattr(0, TCSANOW, &old_termios);
	return error == 0 ? count : -1;
}

/**
* system_mode
* reset the system to what it was before input_mode was
* called
*/
void system_mode(void)
{
	if (ioctl(0, TCSETA, &term_orig) == -1) {
		return;
	}
	fcntl(0, F_SETFL, kbdflgs);
}
/**
* input_mode
* set the system into raw mode for keyboard i/o
* returns  0 - error
*          1 - no error
*/
int input_mode(void)
{
	struct termio term;
	if (ioctl(0, TCGETA, &term) == -1) {
		return 0;
	}

	(void)ioctl(0, TCGETA, &term_orig);
	term.c_iflag = 0;
	term.c_oflag = 0;
	term.c_lflag = 0;
	term.c_cc[VMIN] = 1;
	term.c_cc[VTIME] = 0;
	if (ioctl(0, TCSETA, &term) == -1) {
		return 0;
	}
	kbdflgs = fcntl(0, F_GETFL, 0);
	int flags = fcntl(0, F_GETFL);
	flags &= ~O_NDELAY;
	fcntl(0, F_SETFL, flags);
	return 1;
}

/**
* getch
* read a single character from the keyboard without echo
* returns: the keypress character
*/
int getch(void)
{
	unsigned char ch;
	input_mode();
	while (read(0, &ch, 1) != 1);
	system_mode();
	return (ch);
}

int main()
{
	while (!kbhit())
	{
		cout << "chenxun is a sb" << endl;
	}
}
时间: 2024-10-15 10:34:34

linux下模拟按键kbhit(),检测按键终止while(1)死循环的相关文章

在Linux下的中断方式读取按键驱动程序

// 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) // 为了使设备支持异步通知机制,驱动程序中涉及以下3项工作: // 1. 支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID. // 不过此项工作已由内核完成,设备驱动无须处理. // 2. 支持F_SETFL命令的处理,每当FASYNC标志改变时,驱动程序

Linux下模拟一个简易的消息机制

声明 #define MSG_ERROR  -1 #define MSG_SUCCEED 0 #define MSG_TRUE 1 #define MSG_FALSE 0 #define PM_NOREMOVE    0x00 #define PM_REMOVE    0x01 typedef unsigned long  WPARAM; typedef unsigned long  LPARAM; typedef unsigned int UINT; typedef int MSG_BOOL;

Linux下模拟多线程的并发并发shell脚本

分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用.     以下脚本功能是通过scp(也可选rsync)向上千台服务器传更新包,脚本运行后同时在后台有50个scp进程向服务器传包.#!/bin/baship=`cat iplist.txt|grep -v "#"|awk '{print $1}'`   #过滤服务器IPdir='/usr/l

Linux下C++内存泄露检测工具

下载安装:http://blog.csdn.net/wanglin754/article/details/7194145 下载地址:http://www.valgrind.org/downloads/current.html#current 安装valgrind tar jxvf valgrind-3.7.0.tar.bz2             注意这里的参数里加了j,表示有bz2属性 cd valgrind-3.7.0 ./configure make make install make

linux 下模拟延时与丢包 tc qdisc

TC qdisc linux下的流量控制 修改ping测试的延时 增加规则: # tc qdisc add dev eth0 root 删除规则: # tc qdisc add dev eth0 root 修改规则: # tc qdisc change dev eth0 root 查看规则: # tc qdisc list Or # tc qdisc show 使用从eth0接口ping的延时为1000ms  上下波动为10ms tc qdisc add dev eth0 root netem

Linux下模拟实现进度条

进度条是什么?进度条就是在你下载文件.软件.游戏等出现的进度,它会显示你在有百分之多少就能下载好这个东西. 由于自己的好奇,我就在Linux下实现了这个东西. 我的实现思路: 1.给一个数组,这个数组必须能保存下100个字符. 2.然后把数组看成一行来读取. 3.最后标准输出在屏幕上. 注意: 1.我们要打印个进度条肯定是100%的,所以需要一个能够刚下100个字符的数组是必要的,但是需要注意的是要多开辟一个字符放'/0',开辟好以后还需要全部初始化成'/0'防止输出字符串的时候出现乱码. 2.

linux下U盘状态检测

Linux的文件系统是异步的,也就是说写一个文件不是立刻保存到介质(硬盘,U盘等)中,而是存到缓冲区内,等积累到一定程度再一起保存到介质中.如果没有umount就非法拔出U盘,程序是不知道的,fopen,fwrite等函数都依然返回正确,知道操作系统要把写介质的时候,才会提示I/O错误.可是很多数据都会因为这个不及时的错误报告而丢失.    事实上,USB驱动程序在U盘插入和拔出时,都对系统配置文件做了修改.    例如U盘驱动程序会在插入或拔出时往 /proc/scsi/usb-storage

linux下模拟CPU占用100%小程序

在做一个测试时,需要模拟服务器CPU占用满的情况,在查阅相关资料后,发现网上程序不太好用, 原文在这:http://www.2cto.com/os/201304/202068.html 优化后如下: #! /bin/sh # filename killcpu.sh if [ $# -ne 1 ] ; then echo "USAGE: $0 <CPUs>|stop" exit 1; fi stop() { while read LINE do kill -9 $LINE e

linux下模拟一个木马程序运行过程

预备知识: 将一个程序放入到后台,悄悄的执行 ./xxx.sh & 进程: 用户进程:由用户来管理 系统进程:由系统内核自行管理 系统中的每个进程,都有一个位置的ID,这就是pid,而且每次启动进程以后,PID都不相同 进程相关的命令 jobs 作用:查看当前运行在后台的进程有哪些 信息 第一列:进程编号 第二列:进程状态 第三列:进程是如何发起的 fg   进程编号    把进程从后台调到前台执行 kill %进程编号  杀死进程 ps aux   打印系统所有进程 num=`ps aux |