不可靠信号
不可靠信号在被阻塞时,程序是不会响应信号处理的。这并不是说程序没收到信号,而是程序把接收到的信号放到了缓冲区,一旦该信号解除阻塞则会立即被发送一次(不可靠信号会丢失),之后程序可以正常响应信号处理。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void sig_usr(int signal)
{
if (signal == SIGQUIT)
{
printf("Received SIGQUIT signal!\n");
}
}
int main()
{
struct sigaction act;
act.sa_handler = sig_usr;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGQUIT); //添加SIGQUIT到信号集
if (sigaction(SIGQUIT, &act, NULL) < 0) //设置SIGQUIT信号处理方式
{
printf("sigaction act error.\n");
return -1;
}
printf("SIGQUIT signal blocked\n");
sigprocmask(SIG_BLOCK, &act.sa_mask, NULL); //阻塞信号集
sleep(10);
printf("SIGQUIT signal unblocked\n");
sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL); //非阻塞信号集
sleep(10);
sleep(10);
return 0;
}
可靠信号
可靠信号在被阻塞时,程序也是不会响应信号处理的。程序同样把接收到的信号放到了缓冲区,一旦该信号解除阻塞则会立即被发送,不同于不可靠信号的是可靠信号支持排队不丢失,缓存了几个信号就会被发送几次,之后程序同样可以正常响应信号处理。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void sig_usr(int signal)
{
if (signal == SIGRTMIN)
{
printf("Received SIGRTMIN signal!\n");
}
}
int main()
{
struct sigaction act;
act.sa_handler = sig_usr;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGRTMIN); //添加SIGRTMIN信号到信号集
if (sigaction(SIGRTMIN, &act, NULL) < 0) //设置SIGRTMIN信号处理方式
{
printf("sigaction act error.\n");
return -1;
}
printf("SIGRTMIN signal blocked\n");
sigprocmask(SIG_BLOCK, &act.sa_mask, NULL); //阻塞信号集
sleep(30);
printf("SIGRTMIN signal unblocked\n");
sigprocmask(SIG_UNBLOCK, &act.sa_mask, NULL);//非阻塞信号集
sleep(10);
sleep(10);
return 0;
}
参考网址: http://www.cnblogs.com/encode/archive/2012/06/13/2547493.html