歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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\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. }  
Copyright © Linux教程網 All Rights Reserved