二、信号阻塞与未诀
三、信号集操作函数 (1)、信号集 函数声明:
#include <signal.h>函数参数:信号集,信号代码 返回值:成功返回0,失败返回-1
int sigemptyset(sigset_t *set);//全部置0
int sigfillset(sigset_t *set);//全部置1
int sigaddset(sigset_t *set, int signum);//添加对应位
int sigdelset(sigset_t *set, int signum);//删除对应位
int sigismember(const sigset_t *set, int signum);//是否为1
(2)、读取或更改进程的信号屏蔽字 函数声明:
#include <signal.h>函数参数:改变方式,信号集,原来的信号集 返回值:成功返回0,失败返回-1并设置errno
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非空指针,则更改进程的信号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针,则先将原来的信号屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。
示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
void handle(int sig);
void printsigset(sigset_t* set)
{
int i;
for (i=1;i < 64; ++i)
{
if (sigismember(set,i))
putchar('1');
else
putchar('0');
}
printf("\n");
}
int main(int argc,char* argv[])
{
sigset_t pset;
sigset_t bset;
sigemptyset(&bset);
sigaddset(&bset,SIGINT);
if (signal(SIGINT,handle) == SIG_ERR)
ERR_EXIT("signal error");
if (signal(SIGQUIT,handle) == SIG_ERR)
ERR_EXIT("signal error");
sigprocmask(SIG_BLOCK,&bset,NULL);
for(;;)
{
sigpending(&pset);
printsigset(&pset);
sleep(1);
}
return 0;
}
void handle(int sig)
{
printf("recv a sig=%d\n",sig);
if (sig == SIGQUIT)
{
sigset_t uset;
sigemptyset(&uset);
sigaddset(&uset,SIGINT);
sigprocmask(SIG_UNBLOCK,&uset,NULL);
}
}