5·Linux应用编程和网络编程---Linux中的信号 笔记


1. 什么是信号

1·1 信号是内容受限的一种异步通信机制

(1)信号的目的:用来通信。进程与进程之间的通信,进程与内核之间的通信。

(2)对比硬件中断,信号是异步的。

(3)信号本质上是int类型数字编号(已经定义好的)

1·2 信号由谁发出
(1)用户在终端按下按键
(2)硬件异常后由操作系统内核发出信号
(3)用户使用kill命令向其他进程发出信号
(4)某种软件条件满足后也会发出信号,比如alarm闹钟时间到会产生SIGALARM信号,向一个读端已经关闭的管道write时会产生一个SIGPIPE信号

1·3 信号由谁处理,如何处理
(1)忽略信号
(2)捕获信号
(3)默认信号

2· 常见信号介绍

在这里插入图片描述

3· 进程对信号的处理

用signal函数处理SIGINT信号
signal函数绑定一个捕获函数后 信号发生后会自动执行绑定的捕获函数(自己写的),并且把信号编号作为传参给捕获函数。
signal的返回值在出错时为SIG_ERR,绑定成功时返回旧的捕获函数。

4· alarm函数 和 pause函数

alarm函数:定时后发出一个SIGALRM信号,捕获函数(自己写的)去捕获这个信号并且执行一定的功能。

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

void func_buhuo( int sig)
{
	if(sig == SIGALRM)
	{
			printf("this is func_buhuo!!\n");
	}
}

int main(void)
{
	 int ret = -1;
	signal(SIGALRM,func_buhuo);// 将SIGALRM信号与捕获函数绑定

	ret = alarm(5);// 定时5s的闹钟,到时间后会发送SIGALRM信号。
	printf("ret = %d\n", ret);

	while(1);
// 这里死循环是因为让main函数一直执行,
//避免捕获函数等不到闹钟信号的情况
/*简述一下过程:alarm函数会定时一个5s的闹钟,
	在5s的闹钟计时的时间内,main函数还是会
	往后面执行,所以一定要保证后面的程序可以
	让main函数一直执行至少5s,
	这样才能使alarm函数发送SIGLARM信号让捕获函数去捕获
*/
	return 0;
}

结果:
ret = 0
this is func_buhuo!!  【过了5秒才打印出这句话的】
^C  【由于main函数是一种死循环所以需要CTRL C 结束执行】
alarm函数的返回值就是上一次alarm函数的剩余定时秒数

while(1)是占用cpu来消耗时间,while(1)的时候cpu并不能去执行其他的。

但是pause函数与while(1)不同。内核睡眠,让当前进程暂停运行,交出cpu给其他进程去执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值