Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 一步一步学Linux C:sigsuspend 进程阻塞

int sigsuspend(const sigset_t *sigmask);此函数用于进程的挂起,sigmask指向一个信号集。当此函数被调用时,sigmask所指向的信号集中的信号将赋值给信号掩码。之后进程挂起。直到进程捕捉到信号,并调用处理函数返回时,函数sigsuspend返回。信号掩码恢复为信号调用前的值,同时将errno设为EINTR。进程结束信号可将其立即停止。
  1. #include <stdio.h>   
  2. #include <signal.h>   
  3.   
  4. void checkset();  
  5. void func();  
  6. void main()  
  7. {  
  8.      sigset_tblockset,oldblockset,zeroset,pendmask;  
  9.      printf("pid:%ld ",(long)getpid());  
  10.      signal(SIGINT,func);  
  11.   
  12.      sigemptyset(&blockset);  
  13.      sigemptyset(&zeroset);  
  14.      sigaddset(&blockset,SIGINT);  
  15.   
  16.      sigprocmask(SIG_SETMASK,&blockset,&oldblockset);  
  17.      checkset();  
  18.      sigpending(&pendmask);  
  19.   
  20.      if(sigismember(&pendmask,SIGINT))  
  21.          printf("SIGINTpending ");  
  22.   
  23.      if(sigsuspend(&zeroset)!= -1)  
  24.      {  
  25.      printf("sigsuspenderror ");  
  26.      exit(0);  
  27.      }  
  28.   
  29.      printf("afterreturn ");  
  30.      sigprocmask(SIG_SETMASK,&oldblockset,NULL);  
  31.   
  32.      printf("SIGINTunblocked ");  
  33. }  
  34.   
  35. void checkset()  
  36. {    sigset_tset;  
  37.      printf("checksetstart: ");  
  38.      if(sigprocmask(0,NULL,&set)<0)  
  39.      {  
  40.      printf("checksetsigprocmask error!! ");  
  41.      exit(0);  
  42.      }  
  43.   
  44.      if(sigismember(&set,SIGINT))  
  45.      printf("sigint ");  
  46.   
  47.      if(sigismember(&set,SIGTSTP))  
  48.      printf("sigtstp ");  
  49.   
  50.      if(sigismember(&set,SIGTERM))  
  51.      printf("sigterm ");  
  52.      printf("checksetend ");  
  53. }  
  54.   
  55. void func()  
  56. {  
  57.      printf("hellofunc ");  
  58. }