一、实验目的
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>voidhandler(int sig){if(sig == SIGINT){printf("I have get SIGINT\n");}elseif(sig == SIGQUIT){printf("I have get SIGQUIT\n");}}intmain(){sigset_t sigset,ign;structsigaction act;sigemptyset(&sigset);sigemptyset(&ign);//向信号中添加信号SIGINTsigaddset(&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)。
版权归原作者 Hebuter-2018 所有, 如有侵权,请联系我们删除。