实验: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. [PE结构分析] 6.IMAGE_SECTION_HEADER

    IMAGE_SECTION_HEADER 的源代码如下: typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAM ...

  2. php表单中如何获取单选按钮与复选按钮的值

    php代码中获取表单中单选按钮的值:(单选按钮只能让我们选择一个,这里有一个"checked"属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例:<fo ...

  3. Python正则表达式模块(re模块)

    Python是我接触到的第一门编程语言,虽然它足够简单,但是对于当时刚刚接触编程语言的我来说还是有些难度的,于是只是了解了一些Python的基本语法,稍微深入一点的地方都没怎么了解.不过,到现在为止, ...

  4. PPP模式下的融资结构优化

    PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...

  5. Intellij idea开发Hadoop MapReduce程序

    1.首先下载一个Hadoop包,仅Hadoop即可. http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0 ...

  6. 求Mac 的adt插件!

    搞了半天原来ADT Mac和win是通用的安装方法也相同! 自己配环境! 下载一个Eclipse,然后安装就行! dns:203.195.223.190 这个DNS可以连上谷歌的服务器(只限学习使用) ...

  7. FEE Development Essentials

    FEE Development Essentials JS Basic function call() and apply() func1.bind(thisObj,arg1...argn) Cust ...

  8. Tomcat一些小事

    1.编码问题 1.1.乱码 客户端发请GET请求,如果这个请求地址上有中文,而且也没有进行encode的时候,后端就可能接收到乱码. --解决办法 在tomcat , conf/server.xml ...

  9. 2015年第8本(英文第7本):the city of ember 微光城市

    书名:the City of Ember(中文名:微光城市) 作者:Jeanne DuPrau 单词数:6.2万 不重复单词数:未知 首万词不重复单词数:未知 蓝思值:未知 阅读时间:2015年4月2 ...

  10. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q66-Q69)

    Question 66You have a custom theme named MyTheme. The theme is defined in a file named MyTheme.thmx. ...