那年,一步一步学linux c ---sigsuspend 进程阻塞


本系列文章有muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7334813



int sigsuspend(const sigset_t *sigmask);

此函数用于进程的挂起,sigmask指向一个信号集。当此函数被调用时,sigmask所指向的信号集中的信号将赋值给信号掩码。之后进程挂起。直到进程捕捉到信号,并调用处理函数返回时,函数sigsuspend返回。信号掩码恢复为信号调用前的值,同时将errno设为EINTR。进程结束信号可将其立即停止。

 



#include <stdio.h>
#include <signal.h>

void checkset();
void func();
void main()
{
     sigset_tblockset,oldblockset,zeroset,pendmask;
     printf("pid:%ld\n",(long)getpid());
     signal(SIGINT,func);

     sigemptyset(&blockset);
     sigemptyset(&zeroset);
     sigaddset(&blockset,SIGINT);

     sigprocmask(SIG_SETMASK,&blockset,&oldblockset);
     checkset();
     sigpending(&pendmask);

     if(sigismember(&pendmask,SIGINT))
         printf("SIGINTpending\n");

     if(sigsuspend(&zeroset)!= -1)
     {
     printf("sigsuspenderror\n");
     exit(0);
     }

     printf("afterreturn\n");
     sigprocmask(SIG_SETMASK,&oldblockset,NULL);

     printf("SIGINTunblocked\n");
}

void checkset()
{    sigset_tset;
     printf("checksetstart:\n");
     if(sigprocmask(0,NULL,&set)<0)
     {
     printf("checksetsigprocmask error!!\n");
     exit(0);
     }

     if(sigismember(&set,SIGINT))
     printf("sigint\n");

     if(sigismember(&set,SIGTSTP))
     printf("sigtstp\n");

     if(sigismember(&set,SIGTERM))
     printf("sigterm\n");
     printf("checksetend\n");
}

void func()
{
     printf("hellofunc\n");
}

那年,一步一步学linux c ---sigsuspend 进程阻塞_第1张图片

你可能感兴趣的:(c,linux,null,Signal)