lv6 嵌入式开发-Flappy bird项目(信号机制、定时器功能实现)

news2024/11/26 0:54:12

目录

1 信号(signal)

2 设置信号响应方式 – signal

3 设置定时器

4 示例


问题:

getch()阻塞获取键盘按键输入, 怎么操作才能不影响小鸟下落和管道移动?

getch如果阻塞,下面的程序都是无法执行。通过信号机制方式实现。

1 信号(signal)

在Linux中,软中断信号(signal,简称为信号)是在软件层次上对中断的一种模拟,用来通知进程发生了异步事件。内核可以因为内部事件而给进程发送信号,通知进程发生了某个事件。

信号响应的方式:

1.忽略信号,即对信号不做任何处理;

2.捕捉信号,即信号发生时执行用户自定义的信号处理函数。

3.执行缺省操作,Linux对每种信号都规定了默认操作。

信号的检测与处理流程图

2 设置信号响应方式 – signal

#include  <unistd.h>
#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler); 

成功时返回原先的信号处理函数,失败时返回SIG_ERR  

signum:指明了所要处理的信号类型  

handler:描述了与信号关联的动作               

        SIG_DFL代表缺省方式; SIG_IGN 代表忽略信号;               

        指定的信号处理函数代表捕捉方式

示例

// 头文件省略
void handler (int signo) {

     printf(“HELLO!\n”); 
}

int  main() {
     signal(SIGINT, handler);
      while ( 1 ) ;
      return 0;
}

3 设置定时器

struct itimerval {
    struct timeval it_interval; /* 计时器重新启动的间歇值 */
    struct timeval it_value;    /* 计时器安装后首次启动的初 };                               始值,之后就没有用 */
struct timeval {
    long tv_sec;       /* 秒 */
    long tv_usec;      /* 微妙*/
};

计时器的实现

int setitimer(int which, const struct itimerval *value,            
                struct itimerval *ovalue)

参数: which:间歇计时器类型,    

                   ITIMER_REAL     //数值为0,发送的信号是SIGALRM。

            struct itimerval *value:将value指向的结构体设为计时器的当前值,

            struct itimerval *ovalue:保存计时器原有值。一般设置为NULL。

返回值: 成功返回0。失败返回-1。

4 示例

#include <stdio.h>
#include <curses.h>
#include <signal.h>
#include <sys/time.h>

int x=10,y=10;
int a=5,b=10;
void handler(int sig)
{
	move(a,b);
	addch('B');
	refresh();
	b++;

}
int main(int argc, const char *argv[])
{
	char ch;
	initscr();//进入curses模式
	curs_set(0);
	noecho();//禁止字符显示
	keypad(stdscr,1);//允许使用功能键
	start_color();//启动颜色机制
	init_pair(1,COLOR_WHITE, COLOR_RED);
	init_pair(2,COLOR_GREEN,COLOR_WHITE);

	signal(SIGALRM, handler);

	/*设置定时时间*/
	struct itimerval timer;
	timer.it_value.tv_sec = 3;//首次启动定时时间
	timer.it_value.tv_usec = 0;
	timer.it_interval.tv_sec = 1;//之后每次的定时时间
	timer.it_interval.tv_usec = 0;
	/*启动定时*/
	setitimer(ITIMER_REAL, &timer, NULL);

	while(1){
		ch = getch();
		if(ch == 'Q')
		{
			attron(COLOR_PAIR(1));
			move(x,y);
			addch('A');
			refresh();
			y++;
			attroff(COLOR_PAIR(1));
		}
	}

	while(1);
	endwin();//退出curses模式
	return 0;
}

5 练习

使用信号机制实现每隔1s打印字符串“Flappy bird”,提交代码。

方式1

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

void handle(int sig)
{
	
	printf("Flappy bird\n");
	
}

int main(int argc,char *argv[])
{
	struct sigaction act;
	struct itimerval timevalue;
	int ret;

	
	act.sa_handler = handle;
	act.sa_flags = 0;
	sigemptyset(&act.sa_mask);

	timevalue.it_interval.tv_sec = 1;
	timevalue.it_interval.tv_usec = 0;
	timevalue.it_value.tv_sec = 5;
	timevalue.it_value.tv_usec = 0;

	setitimer(ITIMER_REAL, &timevalue,NULL);
	ret = sigaction(SIGALRM,&act,NULL);

	if(ret < 0)
	{
		perror("sigaction");
		return 0;
	}

	
	while(1)
	{

	}

	return 0;
}

方式2


#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>

void handle(int sig)
{
	
	printf("Flappy bird\n");
	
}

int main(int argc,char *argv[])
{

	struct itimerval timevalue;


	timevalue.it_interval.tv_sec = 1;
	timevalue.it_interval.tv_usec = 0;
	timevalue.it_value.tv_sec = 5;
	timevalue.it_value.tv_usec = 0;

	setitimer(ITIMER_REAL, &timevalue,NULL);
	signal(SIGALRM,handle);


	
	while(1)
	{

	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1056506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享46个Python源代码总有一个是你想要的

分享46个Python源代码总有一个是你想要的 下载链接&#xff1a;https://pan.baidu.com/s/1oZPrXHwgzcvVpB36_dA72A?pwd8888 提取码&#xff1a;8888 chat-web项目的python后端 Django WEB商城网站项目 django-实时接口获取中国各个城市、省份、国家的新型冠状肺炎 NewsSp…

多线程 - 阻塞式队列

阻塞队列 阻塞队列,也是一个队列 ~~ 先进先出 实际上有一些特殊的队列,不一定非得遵守先进先出的 ~~ 优先级队列(PriorityQueue) 阻塞队列,也是特殊的队列,虽然也是先进先出的,但是带有特殊的功能: 阻塞 如果队列为空,执行出队列操作,就会阻塞.阻塞到另一个线程往队列里添加元…

Go:实现SMTP邮件发送订阅功能(包含163邮箱、163企业邮箱、谷歌gmail邮箱)

需求很简单&#xff0c;就是用户输入自己的邮箱后&#xff0c;使用官方邮箱给用户发送替邮件模版 目录 前置邮件模版邮箱开启SMTP服务163邮箱163企业邮箱谷歌gmail邮箱腾讯企业邮箱-失败其他邮箱-未操作 邮件发送核心代码config.yaml配置读取邮件相关配置发送邮件 附录 前置 邮…

深度学习笔记之线性代数

深度学习笔记之线性代数 一、向量 在数学表示法中&#xff0c;向量通常记为粗体小写的符号&#xff08;例如&#xff0c;x&#xff0c;y&#xff0c;z&#xff09;当向量表示数据集中的样本时&#xff0c;它们的值具有一定的现实意义。例如研究医院患者可能面临的心脏病发作风…

Ubuntu系统初始设置

更换国内源 安装截图工具 安装中文输入法 安装QQ 参考&#xff1a; 安装双系统win10Ubuntu20.04LTS&#xff08;详细到我自己都害怕&#xff09; 引导方式磁盘分区方法UEFIGPTLegancyMBR 安装网络助手 sudo apt install net-tools 安装VS Code 使用从官网下载.deb安装包…

MySQL使用Xtrabackup在线做主从

1、主库上操作 1.1前提 172.16.11.2&#xff08;主库&#xff09; 172.16.11.4&#xff08;从库&#xff09; 在执行备份之前&#xff0c;确保数据库没有锁定&#xff0c;以避免备份期间的任何写操作。 确保主库上的 MySQL 服务器正在运行&#xff0c;以便备份数据的一致性。…

八、2023.10.2.Linux(二).8

文章目录 17、简述一下虚拟内存和物理内存&#xff0c;为什么要用虚拟内存&#xff0c;好处是什么&#xff1f;18、虚拟地址到物理地址怎么映射的&#xff1f;19、说说堆栈溢出是什么&#xff0c;会怎么样&#xff1f;20、简述操作系统中malloc的实现原理?21、说说进程空间从高…

uboot启动流程-涉及board_init_f 函数

一. uboot启动流程 _main 函数中会调用 board_init_f 函数&#xff0c;本文简单分析一下 board_init_f 函数。 二. board_init_f 函数 board_init_f 函数主要有两个工作&#xff1a; (1) 初始化一系列外设&#xff0c;比如串口、定时器&#xff0c;或者打印一些消息等。…

Docker Tutorial

什么是Docker 为每个应用提供完全隔离的运行环境 Dockerfile&#xff0c; Image&#xff0c;Container Image&#xff1a; 相当于虚拟机的快照&#xff08;snapshot&#xff09;里面包含了我们需要部署的应用程序以及替它所关联的所有库。通过image&#xff0c;我们可以创建很…

音乐创作软件:ToneLIB Jam v4.7.8 Crack

从强大的选项卡编辑器到 3D 模式 Tonelib Jam 是一款用于播放和创作音乐的综合软件应用程序。TL Jam专为初学者和经验丰富的吉他手而设计&#xff0c;可以提供一个完美的平台来掌握乐器&#xff0c;让您轻松学习自己喜欢的歌曲或设置高效的日常吉他练习程序。TL Jam 具有功能强…

目标检测|边框检测框转换,交并比计算 代码实现

文章目录 1. 相互转换的函数2.交并比实现 在目标检测任务中&#xff0c;非常重要的一部分就是框出检测框 这就需要检测框的位置大小等一些信息 一般我们有如下两种方式标记一个检测的位置和大小 1 两点法 检测框左上角坐标(x1,y1)&#xff0c;检测框右下角坐标&#xff08;x2…

2023年最新云存储工具排行榜:找到适合你的云存储服务

随着数据规模的不断增长&#xff0c;传统的本地存储已经无法满足用户的需求。云存储工具通过提供灵活、安全和高效的数据存储服务&#xff0c;成为了现代化的数据管理方式。在众多云存储工具中&#xff0c;有一些在功能和性能方面表现出色&#xff0c;成为用户首选。下面是2023…

时间序列-AR模型与MA模型的原理与实现

文章目录 1 自回归模型AR Model1.1 自回归模型 vs 多元线性回归模型1.1.1 线性回归1.1.2 AR(1)模型1.1.3 AR(p)模型 1.2 AR建模问题 2 移动平均模型 MA Model2.1 MA模型的数学表示2.1.1 MA(1)模型2.2.2 MA(q)模型 2.2 MA建模问题 ARIMA模型是AR模型&#xff08;自回归模型&…

计算机网络(二):物理层

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据链路层只需要考虑如何完成本…

levelDB引擎

一、背景 1.1、影响磁盘性能的因素&#xff1a; 主要受限于磁盘的寻道时间&#xff0c;优化磁盘数据访问的方法是尽量减少磁盘的IO次数。磁盘数据访问效率取决于磁盘IO次数&#xff0c;而磁盘IO次数又取决于数据在磁盘上的组织方式。磁盘数据存储大多采用B树类型数据结构&…

排序篇(三)----交换排序

排序篇(三)----交换排序 1.冒泡排序 基本思想: ​ 通过不断地比较相邻的元素&#xff0c;将较大的元素往后移动&#xff0c;从而实现排序的目的。 具体的步骤如下&#xff1a; 从待排序的数组中选择相邻的两个元素进行比较&#xff0c;如果前一个元素大于后一个元素&#…

Java编程技巧:swagger2、knif4j集成SpringBoot或者SpringCloud项目

目录 1、springbootswagger2knif4j2、springbootswagger3knif4j3、springcloudswagger2knif4j 1、springbootswagger2knif4j 2、springbootswagger3knif4j 3、springcloudswagger2knif4j 注意点&#xff1a; Api注解&#xff1a;Controller类上的Api注解需要添加tags属性&a…

在云服务器上打开ftp服务-踩坑及心得

我们产生这个需求的原因是因为打算搭建一个博客&#xff0c;选择了使用wordpress框架。然后&#xff0c;在安装插件的过程中&#xff0c;需要使用FTP服务进行操作。于是&#xff0c;我们决定搞清楚这个过程&#xff0c;并在其中遇到的困难进行记录。 一、安装vsftpd # 安装 s…

python生成中金所期权行权价

参考沪深300股指期权的合约表&#xff0c;写一个工具函数&#xff1a; 使用方法 def get_format_option_gap(value: float, deviation: int 0): # 根据中证1000指数获取点位"""根据标准的行权价&#xff0c;生成不同档位的期权列表&#xff0c;适合中金所:…

铁道货车通用技术条件

声明 本文是学习GB-T 5600-2018 铁道货车通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 90 mm90 mm。 B.2 制造要求 B.2.1 车体钢结构组成后&#xff1a; a) 敞车钢质侧、端板的平面度公差应小于或等于15 mm/m; 压型侧、端板的平面度…