一、实验目的
1、了解采用信号机制通信的原理;
2、掌握信号的使用方法。
二、实验内容
编写sigaction.c源程序,实现如下功能:
1、 a.捕获“Ctrl-C”信号时,打印”I have get SIGINT.”;
b.捕获“Ctrl-\”信号时,打印”I have get SIGQUIT.”。
2、 a.设置进程屏蔽字,本例中屏蔽信号SIGINT,并测试SIGINT是否被屏蔽,如果被屏蔽,输出“The SIGINT signal has been ignored”;
b.取消对SIGINT的屏蔽并挂起进程,然后再次按下“Ctrl-C”,查看结果。
三、源程序
sigaction.c:
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<signal.h>
/*
pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断
*/
// 函数原型声明
void print_1();
void print_2();
void print_4();
void handler(int sig);
// 主函数
int main(int argc, char *argv[])
{
sigset_t sigset;
struct sigaction act;
// 初始化信号集合为空
sigemptyset(&sigset);
// 向信号中添加信号SIGINT
sigaddset(&sigset,SIGINT);
// 信号处理函数
act.sa_handler=handler;
// 设置信号集
sigemptyset(&act.sa_mask);
act.sa_flags=0;
// 改变进程接收到特定信号后的行为
if (sigaction(SIGINT, &act, NULL) < 0)
{
// 打印出错信息
do {
perror("sigaction error");
exit(EXIT_FAILURE);
} while(0);
}
if (sigaction(SIGQUIT, &act, NULL) < 0)
{
// 打印出错信息
do {
perror("sigaction error");
exit(EXIT_FAILURE);
} while(0);
}
printf("\n等待信号中...\n");
// 挂起进程 等待信号
pause();
pause();
printf("\nCtrl+C屏蔽中\n");
signal(SIGINT, print_4);
// 挂起进程 等待信号
pause();
signal(SIGINT, handler);
printf("\n屏蔽结束\n");
printf("\n等待信号中...\n");
pause();//挂起进程 等待信号
return 0;
}
void handler(int sig)
{
printf("\nrev sig=%d\n", sig);
if(sig == SIGINT)
{
print_1();
}
else if(sig == SIGQUIT)
{
print_2();
}
}
void print_1()
{
printf("\nI have get SIGINT.\n");
}
void print_2()
{
printf("\nI have get SIGQUIT.\n");
}
void print_4()
{
printf("\nThe SIGINT signal has been ignored.\n");
}
四、实验步骤、结果截图
(1)使用GCC命令进行编译;
(2)运行并验证结果是否正确。结果如下: