Chinaunix首页 | 论坛 | 博客
  • 博客访问: 395162
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1707
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-27 11:18
个人简介

学无止境……

文章分类

全部博文(85)

分类: LINUX

2014-07-07 08:46:11

在网上看了好多关于这两个系统调用的解释,但是一直没完全弄明白两者之间的区别。于是自己沉下心,仔细研究了下,并结合网友的帖子总结两者的区别。希望对大家有用。本人也是初学者,可能理解有误,仅作参考。
sigsuspend()和pause()都可用于使程序挂起休眠,但是在某些场合下,两者会产生不同的效果。
应用场景:需要先阻塞某个信号,然后解除阻塞等待该信号并捕获执行相关操作。
这种场景可以使用sigsuspend() 或这 sigprocmask()+pause() 完成,但是他们之间是有区别的。为了便于理解直接用图解法,直观、简洁。上图咯:



以上两种方式,
相比pause() ,sigsuspend()不会有信号丢失的情况。因为它把 sigprocmask()+pause() 合并为一个原子操作,不会像sigprocmask()+pause()存在函数切换的窗口时间。所以在如上的应用场景下推荐使用sigsuspend().
sigsuspend()的整个原子操作过程为:
(1) 设置新的mask阻塞当前进程;
(2) 收到信号,恢复原先mask;
(3) 调用该进程设置的信号处理函数;
(4) 待信号处理函数返回后,sigsuspend返回。

代码如下:(运行结果自行测试)

点击(此处)折叠或打开

  1. /**此代码来自网上**/
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6.  
  7.  void func(int num)
  8.  {
  9.          printf("0\n");
  10.  }
  11.  
  12.  int main(void)
  13.  {
  14.          int i;
  15.          sigset_t set;
  16.          sigset_t empty;
  17.  
  18.          sigemptyset(&set);
  19.          sigemptyset(&empty);
  20.          sigaddset(&set, SIGINT);
  21.          signal(SIGINT, func);
  22.  
  23.          while(1)
  24.          {
  25.                  sigprocmask(SIG_BLOCK, &set, NULL);
  26.                  for(i = 0; i < 5 ; i++)
  27.                  {
  28.                          write(1, "* ", strlen("* "));
  29.                          sleep(1);
  30.                  }
  31.                  printf("\n");
  32.  #if 1
  33.                  sigsuspend(&empty);
  34.  #else
  35.                  sigprocmask(SIG_UNBLOCK, &set, NULL);
  36.                 pause();
  37.  #endif
  38.          }
  39.  
  40.  return 0;
  41. }

阅读(6606) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~