76_信号之进程对信号的处理

默认处理

忽略处理

捕获处理


默认和忽略都不用深究了,之前就都是默认忽略的

捕获处理:注册等钱进程在OS中,某一个信号的处理方法,注册一个处理方法,指向的函数就是处理方法

用signal函数吃力SIGINT信号


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

void func(int sig)
{
	printf("signal for %d.\n", sig);
}

int main(void)
{
	signal(SIGINT, func);
	
	printf("befor while(1);\n");
	while(1);
	printf("after while(1);\n");
	
	return 0;
}

细节:signal的返回值是之前的处理方法(默认/忽略/捕获)

signal绑定一个捕获函数后,信号发生后    会自动执行绑定的捕获函数,并且把信号编号给捕获函数


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

void func(int sig)
{
	printf("signal for %d.\n", sig);	
}

int main(void)
{
	//signal(SIGINT, func);//捕获
	//signal(SIGINT, SIG_DFL);//默认
	signal(SIGINT, SIG_IGN);//忽略
	
	printf("befor while(1);\n");
	while(1);
	printf("after while(1);\n");
	
	return 0;
}
signal函数的意思是: 对那个信号做什么处理(默认/忽略/捕获)



sigaction可以一次得到新旧捕获数值,可以同时,也可以单独,可以单独获取旧的(不设置新的就能知道旧的)

signal只能在设置新的同时才能获取旧的,需要两次才能得到旧的,设置新的,在恢复旧的


进程信号处理过程:(1)在目的进程中安装该信号,即设置如果目标进程捕获该信号时执行的操作代码。Linux采用sigal和sgation系统调用来完成。因信号是异步事件的典型应用,产生信号进程而言是随机出现的,因此,进程不能预先知道信号会不会发送到当前进程,也不能预先知道信号什么时候发送到当前进程,因此只能在信号到来前告诉内核“在此信号发生时,请执行下列操作”,即所谓的安装信号。 (2)信号被某个进程产生,同时设置信号的目标进程(一般为目标进程的pid),然后由操作系统管理。Linux采用kill()、arise()、alarm()等系统调用来实现。 (3)信号在目的进程被注册。操作系统将信号添加到目的进程的PCB相关的数据结构中。在每个进程的PCB (task_struct结构)中有一个未决信号的数据成员。 (3)信号进程中的注销。进程在执行信号相应处理函数之前,首先要把信号进程中注销。如果存在未决信号等待处理且该信号没有被进程屏蔽,则在运行相应的信号处理函数前,进程会把信号在未决信号链中占有的结构卸掉。 (5)信号生命终止。进程注销信号后,目的进程根据当前进程对此信号设置处理方式,暂时终止当前代码的执行,保护上下文,转而执行信号处理函数,即捕获该信号,执行完成后再恢复到被中断的位置继续执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值