sigsuspend 函数等待信号处理程序改变全局变量用法

 

功能描述:
sigsuspend 函数将进程的信号屏蔽字设置为 sigmask 指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返 回,在返回之前,将进程的信号屏蔽字设置为调用sigsuspend之前的值。


用 法:
# include < signal . h> 
int sigsuspend ( const sigset_t * sigmask ) ; 


参 数:
sigmask:  指向信号集的指针,里面设置了屏蔽的信号


返回说明:
函数没有成功返回值。如果它返回到调用者,则总是返回-1,并将 errno 设置为EINTR(表示一个被中断的系统调用)。

 

 

列子:

 

[cpp]   view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <signal.h>  
  4. volatile sig_atomic_t quitflag; /* set nonzero by signal handler */  
  5.   
  6.  /* one signal handler for SIGINT and SIGQUIT */  
  7. static void sig_handler(int signo)  
  8. {  
  9.     if (signo == SIGINT)  
  10.                 printf("ninterruptn");  
  11.         else if (signo == SIGQUIT)  
  12.                 quitflag = 1; /* set flag for main loop */  
  13. }  
  14. int main(int argc, char *argv[])  
  15. {  
  16.         sigset_t newmask, oldmask, zeromask;  
  17.         if (signal(SIGINT, sig_handler) == SIG_ERR)  
  18.                 perror("signal(SIGINT) error");  
  19.         if (signal(SIGQUIT, sig_handler) == SIG_ERR)  
  20.                 perror("signal(SIGQUIT) error");  
  21.         sigemptyset(&newmask);  
  22.         sigemptyset(&zeromask);  
  23.         sigaddset(&newmask, SIGQUIT);  
  24.         /* Block SIGQUIT and save current signal mask */  
  25.         if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) != 0)  
  26.                 perror("sigprocmask SIG_BLOCK error");  
  27.       
  28.         while (quitflag == 0)  
  29.                 sigsuspend(&zeromask);  
  30.         quitflag = 0;  
  31.         /* Reset signal mask which unblocks SIGQUIT */  
  32.         if (sigprocmask(SIG_SETMASK, &oldmask, NULL) != 0)  
  33.                 perror("sigprocmask SIG_SETMASK error");  
  34.         exit(0);  
  35. }  
 

我们运行程序:

输入: ctrl+c   :    输出 :  interrept

输入: ctrl+c   :    输出 :  interrept

输入: ctrl+c   :    输出 :  interrept

输入: ctrl+c   :    输出 :  interrept

输入: ctrl+/         程序终止

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值