嵌入式操作系统实验——信号

一、实验目的

1、了解采用信号机制进行进程间通信的原理。
2、掌握通过信号进行进程间通信的方法。

二、实验内容

编写sigaction.c源程序,实现如下功能:
1、a.捕获“Ctrl-C”信号时,输出”I have get SIGINT.”
b.捕获“Ctrl-\”信号时, 输出”I have get SIGQUIT.”
2、a.设置进程屏蔽字,本例中屏蔽信号SIGINT,并通过调用信号集函数测试SIGINT是否被屏蔽,如果被 屏蔽,输出“The SIGINT signalhas been ignored”。
b.从信号SIGINT所在的信号集中删除SIGINT,同时取消对SIGINT的屏蔽并挂起进程。接着再次按下“Ctrl-C”,输出”I have get SIGINT.”。

三、实验源程序及结果截图

sigaction.c文件:

#include<unistd.h>
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
void handler(int sig)
{
	 if (sig == SIGINT) { 
		printf("I have get SIGINT\n"); 
	} 
	else if (sig == SIGQUIT) { 
		printf("I have get SIGQUIT\n"); 
	} 
}
int main()
{
	sigset_t sigset,ign;
	struct sigaction act;
	sigemptyset(&sigset);
	sigemptyset(&ign);
	//向信号中添加信号SIGINT
	sigaddset(&sigset,SIGINT);
	//设置处理函数和信号集
	act.sa_handler=handler;
	sigemptyset(&act.sa_mask);
	act.sa_flags=0;
	sigaction(SIGINT,&act,0);
	sigaction(SIGQUIT,&act,0);
	printf("Wait the signal...\n");
	pause();//挂起进程 等待信号
	pause();
	printf("The SIGINT signalhas been ignored\n");
	sigprocmask(SIG_SETMASK,&sigset,NULL);//暂时进入待处理状态 
	pause();//挂起进程 等待信号
	sigprocmask(SIG_UNBLOCK,&sigset,NULL);//在信号屏蔽字中删除sigset信号
	printf("屏蔽结束\n");
	printf("Wait the signal SIGINT..\n");
	pause();//挂起进程 等待信号
}

运行sigaction.c并输入Ctrl+C
在这里插入图片描述
输入Ctrl+\测试
在这里插入图片描述
此时进程运行到SIGINT被屏蔽,输入Ctrl+C测试
在这里插入图片描述
但此时Ctrl+\没有被屏蔽,输入Ctrl+
在这里插入图片描述
此时屏蔽已经删除,Ctrl+C测试有效
在这里插入图片描述

四、实验问题总结

此次实验中设置信号屏蔽用的是sigprocmask(SIG_SETMASK,&sigset,NULL),但是这种状态下当输入已经屏蔽的信号时并没有真正的忽略,而是进入待处理状态,当这种屏蔽被去掉之后,该函数会处理待处理的信号,并把多个相同的待处理信号当做一个信号处理,所以系统输出了一个I have get SIGINT。取消屏蔽用的函数是sigprocmask(SIG_UNBLOCK,&sigset,NULL)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值