实验:sigsuspend(),sigprocmask()


源代码:
  1. /*
  2. * Program: pause_suspend.c
  3. * To test the difference between sigsuspend() and paus().
  4. * Author: zsl
  5. * Date: 2014-10-17
  6. * First release.
  7. * 参见网页:http://blog.csdn.net/liwentao1091/article/details/6619089
  8. *
  9. * */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <signal.h>
  13. #include <unistd.h>
  14. #include <string.h>
  15. /*
  16. * Handler for SIGINT (Ctrl-C), SIGQUIT (Ctrl-\)
  17. * */
  18. void sig_func(int signo)
  19. {
  20. if ( SIGINT == signo ) // just print a line.
  21. {
  22. printf(" SIGINT is processing...\n ");
  23. }
  24. if ( SIGQUIT == signo ) // print a line and exit.
  25. {
  26. printf(" SIGQUIT is processing ...\n ");
  27. printf(" Now exiting ...\n ");
  28. exit(EXIT_SUCCESS);
  29. }
  30. }
  31. int main(void)
  32. {
  33. int i;
  34. sigset_t maskset, set_quit;
  35. sigemptyset(&maskset);
  36. sigemptyset(&set_quit); // initialize two sets.
  37. sigaddset(&maskset, SIGINT); // mask SIGINT
  38. sigaddset(&set_quit, SIGQUIT); // suspend SIGQUIT
  39. // signal the two signals: SIGINT, SIGQUIT
  40. signal(SIGINT, sig_func);
  41. signal(SIGQUIT, sig_func);
  42. while(1)
  43. {
  44. /* First to mask the signal of the process: SIGINT */
  45. sigprocmask(SIG_BLOCK, &maskset, NULL);
  46. for(i = 0; i < 10; i ++)
  47. {
  48. write(1, "* ", strlen("* "));
  49. sleep(1);
  50. }
  51. printf("\n");
  52. #if 1
  53. /*
  54. * while sigsuspend(), SIGQUIT is blocked.
  55. * but SIGINT is unblocked.
  56. * If you want to execute the two signals, you
  57. * should Ctrl-\, then Ctrl-C.
  58. * */
  59. printf("Before sigsuspend() ... \n");
  60. sigsuspend(&set_quit);
  61. #else
  62. sigprocmask(SIG_UNBLOCK, &maskset, NULL);
  63. pause();
  64. #endif
  65. }
  66. return 0;
  67. }
程序的运行:
在打印“*  ”的时候,SIGINT (Ctrl-C)被 阻塞了。而SIGQUIT没有被阻塞,只要Ctrl-\就会终止程序。
在sigsuspend() 的时候,SIGQUIT (Ctrl-\)被阻塞了,而SIGINT 没有被阻塞,只要 Ctrl-C 就会进入 signal handler 中执行。。
如果想在 sigsuspend() 中对两个信号都进行处理,那么在 sigsuspend() 的时候先 SIGQUIT, 然后 SIGINT。
如下是执行效果图:

实验:sigsuspend(),sigprocmask()的更多相关文章

  1. sigsuspend sigprocmask函数的用法

    一个进程的信号屏蔽字规定了当前堵塞而不能递送给该进程的信号集.调用函数sigprocmask能够检測或更改其信号屏蔽字,或者在一个步骤中同一时候运行这两个操作. #include <signal ...

  2. sigsuspend

    1)头文件:#include <signal.h> 2)一个保护临界区代码的错误实例:(sigprocmask()和pause()实现) #include <unistd.h> ...

  3. linux c编程:信号(五) sigsuspend

    更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞.使用这种技术可以保护不希望由信号中断的代码临界区.如果希望对一个信号解除阻塞,然后pause等待以前被阻塞的信号发生,则又将如何呢?假定信 ...

  4. Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()

    我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...

  5. sigprocmask, sigpending, sigsuspend的用法

    sigset_t set sigemptyset(&set) :清空阻塞信号集合变量 sigfillset(&set) :添加所有的信号到阻塞集合变量里 sigaddset(& ...

  6. sigprocmask , sigpending 和 sigsuspend函数

    转自 http://blog.csdn.net/elbort/article/details/7594772 sigprocmask函数:功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞). ...

  7. APUE读书笔记:关于sigsuspend

    sigsuspend是一个原子操作,为了防止信号丢失而存在的,具体含义看下函数原型. int sigsuspend(const sigset_t *mask); 先忽略参数,sigsuspend完成的 ...

  8. 哈工大 计算机系统 实验七 TinyShell

    所有实验文件可见github 计算机系统实验整理 实验报告 实 验(七) 题 目 TinyShell 微壳 计算机科学与技术学院 目 录 第1章 实验基本信息 - 4 - 1.1 实验目的 - 4 - ...

  9. 【CSAPP】Shell Lab 实验笔记

    shlab这节是要求写个支持任务(job)功能的简易shell,主要考察了linux信号机制的相关内容.难度上如果熟读了<CSAPP>的"异常控制流"一章,应该是可以不 ...

随机推荐

  1. MySQL备份与恢复

    1.通过mysqldump命令进行数据备份 mysql数据库的备份采用直接打包数据库文件夹(注:InnoDB引擎不支持直接拷贝数据文件备份数据库,由于使用InnoDB引擎的库或表是不能使用此种方式): ...

  2. java操作小技巧,遇到过的会一直更新,方便查找

    1.<c:forEach>可以循环map array List 2.操纵数组,不知道类型的情况下,不需要判断数组类型,直接用反射,arrays.Class.isArrays() 获取数组长 ...

  3. php获取textarea的值并处理回车换行的方法

    //注:\n是用双引号包的的,双引号!!双引号!!! explode("\n",$row[0]['value']

  4. 蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事

    前言: 本文是根据的文章Introduction to Monte Carlo Tree Search by Jeff Bradberry所写. Jeff Bradberry还提供了一整套的例子,用p ...

  5. Win7下安装依赖lxml的python插件

    博主python菜鸟,本想在win7下安装一个pyquery玩玩爬虫,折腾了好几天终于搞好了,发现python这坑不是一般的深啊. 有一部分没有截图,请谅解 python版本3.4 1.下载easy_ ...

  6. PHP学习笔记:利用gd库给图片打图片水印

    <?php $dst_path = '1.jpg';//目标图片 $src_path = 'logo1.png';//水印图片 //创建图片的实例 $dst = imagecreatefroms ...

  7. Android 手机卫士16--手机杀毒

    1.指定动画一直旋转 rotateAnimation.setRepeatCount(RotateAnimation.INFINITE); android:repeatCount 重复的次数,默认为0, ...

  8. dbcp 1.4 底层连接断开时内存泄露bug

    在dbcp 1.4中,如果底层的连接已经与数据库断开了,此时dbcp 1.4的实现并不释放内部连接,虽然早已提供了removeAbandoned和removeAbandonedTimeout参数,但是 ...

  9. iOS App上线的秘密

    App上线需要准备几个证书:首先是是CSR证书,要创建这个证书需要在自己电脑上找到钥匙串访问(在应用程序->其他 里面).钥匙串访问->证书助理->从证书颁发机构请求证书如下: 创建 ...

  10. springmvc+mybatis+spring 整合 bootstrap

    获取[下载地址]   [免费支持更新]三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] ...