lv7day2 信号机制 学习笔记

信号 (signal)

        在 Linux 中,软中断信号( signal ,简称为信号)是在软件层次上对中断的一种模拟,用来通知进程发生了异步事件。内核可以因为内部事件而给进程发送信号,通知进程发生了某个事件。
信号响应的方式:
1. 忽略信号,即对信号不做任何处理;
2. 捕捉信号,即信号发生时执行用户自定义的信号处理函数。
3. 执行缺省操作, Linux 对每种信号都规定了默认操作。
      

 设置信号响应方式 – 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 代表忽略信号 ;
指定的信号处理函数代表捕捉方式

signal 函数 – 示例

//头文件省略
void handler (int signo) {
printf(“HELLO!\n”);
}

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

设置定时器

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 。

实现功能:

3秒后,从第五行第十列开始,每秒依次显示出字符'B'。

每当输入字符'Q',从第十行第十列开始,依次显示出字符‘A'。

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值