一步一步学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\n",(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\n");  
  22.   
  23.      if(sigsuspend(&zeroset)!= -1)  
  24.      {  
  25.      printf("sigsuspenderror\n");  
  26.      exit(0);  
  27.      }  
  28.   
  29.      printf("afterreturn\n");  
  30.      sigprocmask(SIG_SETMASK,&oldblockset,NULL);  
  31.   
  32.      printf("SIGINTunblocked\n");  
  33. }  
  34.   
  35. void checkset()  
  36. {    sigset_tset;  
  37.      printf("checksetstart:\n");  
  38.      if(sigprocmask(0,NULL,&set)<0)  
  39.      {  
  40.      printf("checksetsigprocmask error!!\n");  
  41.      exit(0);  
  42.      }  
  43.   
  44.      if(sigismember(&set,SIGINT))  
  45.      printf("sigint\n");  
  46.   
  47.      if(sigismember(&set,SIGTSTP))  
  48.      printf("sigtstp\n");  
  49.   
  50.      if(sigismember(&set,SIGTERM))  
  51.      printf("sigterm\n");  
  52.      printf("checksetend\n");  
  53. }  
  54.   
  55. void func()  
  56. {  
  57.      printf("hellofunc\n");  
  58. }  
一步一步学Linux C:sigsuspend 进程阻塞

相关内容