sigsuspend--让进程挂起,等到特定的信号才继续执行

来源:互联网 发布:布拉热洛纳子爵 知乎 编辑:程序博客网 时间:2024/05/17 08:56

sigsuspend--让进程挂起,等到特定的信号(而int pause(void)等的是任意的信号)才继续执行,就是先不动再动;

而signal函数相反--运行等到特定信号去运行信号处理函数,就是先动再不动(如遇到ctrl-c是停止,其实很多情形不是这样,只是方便记忆而已。)

 

int sigsuspend(const sigset_t *set);void *signal(int signum, void * handler);

sigsuspend函数等的是*set中值为0的bit(因为值为1的bit被屏蔽掉了)。看例子更直观:


example:

#include<signal.h>#include<stdio.h>#include<unistd.h>#include<errno.h>int main(void){        void  sig_int(int);        sigset_t newmask, oldmask, zeromask;        if(signal(SIGINT,sig_int)==SIG_ERR)        {                puts("signal (SIGINT) error");                return 0;         }        if(signal(SIGQUIT,sig_int)==SIG_ERR)        {                puts("signal (SIGQUIT) error");                return 0;        }        sigemptyset(&zeromask);        sigemptyset(&newmask);            sigaddset(&newmask, SIGINT);//把SIGINT加入newmask        if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)//此时信号掩码=SIGINT即屏蔽SIGINT        {                puts("SIG_BLOCK error");                return 0;        }        sigaddset(&zeromask,~SIGINT);//     zeromask中除了SIGINT对应的bit为0其余都为1//等的是值为0的bit(因为值为1的bit被屏蔽掉了,这里是用zeromask的各bit来看的,不是以信号掩码来看的),//即现在等的是SIGINT         sigsuspend(&zeromask);//进程挂起,等待SIGINT        if(sigismember(&zeromask,SIGINT))//肯定没有啦        {                puts("catch signal SIGINT");        }          //quitflag=0;        if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)                return(0);}void sig_int(int signumber){        if(signumber==SIGQUIT)                printf("\nSIGQUIT\n");        else if(signumber==SIGINT)puts("SIGINT comes.");        return;}

/*
output:

运行./a.out,开始在等待,当press ctrl-c时:

[lyt9469@localhost signal]$ g++ sigsuspend.c [lyt9469@localhost signal]$ ./a.out SIGINT comes.


*/

 

原创粉丝点击