Chinaunix首页 | 论坛 | 博客
  • 博客访问: 559649
  • 博文数量: 142
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1452
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 16:28
文章分类

全部博文(142)

文章存档

2016年(10)

2015年(60)

2014年(72)

我的朋友

分类: C/C++

2015-09-25 15:17:50

#include <signal.h>
需要在一个原子操作中先恢复信号屏蔽字,然后使进程休眠,这种功能是由sigsuspend函数提供。
int sigsuspend(const sigset_t *sigmask);
将进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,
该进程被挂起。
如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值。
此函数没有成功返回值。总是返回-1,并且将errno设置为EINTR(表示一个被中断的系统调用).

点击(此处)折叠或打开

  1. #include <signal.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. /*#include <signal.h>
  5.  * 需要在一个原子操作中先恢复信号屏蔽字,然后使进程休眠,这种功能是由sigsuspend函数提供。
  6.  *int sigsuspend(const sigset_t *sigmask);
  7.  * 将进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,
  8.  * 该进程被挂起。
  9.  * 如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值。
  10.  * 此函数没有成功返回值。总是返回-1,并且将errno设置为EINTR(表示一个被中断的系统调用).
  11.  * */
  12. static void sig_int(int);
  13. void proc_mask(const char* str)
  14. {
  15.     sigset_t set;

  16.     if(sigprocmask(SIG_BLOCK,NULL,&set) < 0)
  17.         printf("sigprocmask error\n");

  18.     printf("%s",str);
  19.     if(sigismember(&set,SIGINT)) printf("SIGINT ");
  20.     if(sigismember(&set,SIGUSR1)) printf("SIGUSR1 ");
  21.     if(sigismember(&set,SIGQUIT)) printf("SIGQUIT ");
  22.     if(sigismember(&set,SIGALRM)) printf("ALARM ");

  23.     printf("\n");

  24.     return;
  25. }

  26. int main(void)
  27. {
  28.     sigset_t waitmask,newmask,oldmask;

  29.     proc_mask("program start: ");
  30.     if(signal(SIGINT,sig_int) == SIG_ERR)
  31.         printf("signal(SIGINT) error\n");

  32.     sigemptyset(&newmask);
  33.     sigaddset(&newmask,SIGINT);
  34.     sigemptyset(&waitmask);
  35.     sigaddset(&waitmask,SIGUSR1);

  36.     if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
  37.         printf("sigprocmask error\n");
  38.     
  39.     proc_mask("in critical region: ");
  40.     /*pause, allowing all signals except SIGUSR1*/
  41.     if(sigsuspend(&waitmask) != -1)
  42.         printf("sigsuspend error\n");
  43.     
  44.     proc_mask("after sigsuspend: ");

  45.     if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
  46.         printf("sigprocmask error\n");
  47.     
  48.     proc_mask("program exit: ");

  49.     return 0;
  50. }

  51. static void sig_int(int signo)
  52. {
  53.     proc_mask("\nin sig_int: ");
  54. }

点击(此处)折叠或打开

  1. gwwu@hz-dev2.wgw.com:~/test/signal>gcc -g sigsuspend.c -o sigsuspend
  2. gwwu@hz-dev2.wgw.com:~/test/signal>./sigsuspend
  3. program start:
  4. in critical region: SIGINT
  5. ^C  ---------CTRL+C
  6. in sig_int: SIGINT SIGUSR1
  7. after sigsuspend: SIGINT
  8. program exit:
  9. gwwu@hz-dev2.wgw.com:~/test/signal>


阅读(766) | 评论(0) | 转发(0) |
0

上一篇:linux 进程调度策略

下一篇:centos 启动IPV6

给主人留下些什么吧!~~