写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!
如果发现一些笔记的说法完全是错误的请建议我删除!
YY一番:信号是用来中断进程的执行的,有时候当进程在执行某一个任务的时候可能受到来历不明的信号的干扰,而这种干扰可能给结果带来偏差,所以在使用信号的时候要加以控制。
信号的控制主要是通过使用对某段代码屏蔽信号的模型进行的。
如下代码,看信号是如何干扰一个进程的
<span style="font-size:18px;">#include<unistd.h>
#include<stdio.h>
#include<signal.h>
void handle(int s)
{
printf("MNGB signal coming^^^^^^^stop\n");
sleep(5);
}
int main()
{
printf("%d\n",getpid());
signal(SIGUSR1,handle);
while(1)
{
printf("working do not stop me\n");
sleep(1);
}
return 0;
}
</span>
下面看如何让某一段代码免受一些该段代码不需要的信号的干扰
<span style="font-size:18px;">#include<stdio.h>
#include<unistd.h>
#include<signal.h>
void handle(int s)
{
printf("handling signal\n");
}
int main()
{
printf("%d\n",getpid());
signal(SIGUSR1,handle);
sigset_t sigs;
sigemptyset(&sigs);
sigaddset(&sigs,SIGUSR1);
sigprocmask(SIG_BLOCK,&sigs,0);
while(1)
{
printf("working don't call me\n");
sleep(1);
}
sigprocmask(SIG_UNBLOCK,&sigs,0);
return 0;
}</span>
sigset_t sigs是一个信号存放信号的集合,sigaddset()是一个往信号集合里边加信号的函数,sigprocmask()通过第一个参数来控制是屏蔽还是解除屏蔽信号集合里边的信号。
这里屏蔽了SIGUSR1这个信号,所以当用kill命令向该进程发送SIGUSR1信号的时候被屏蔽的代码段不会被这个信号干扰。