10.12 sigprocmask函数

在10.8节中我们提到进程的掩码是一个当前阻塞信号发送到进程的信号集合。一个进程可以查看其信号掩码,改变其信号掩码,或者同时执行这两个操作,通过调用函数sigprocmask来实现上述要求.

  1. #include <signal.h>
  2. int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
  3. return:0 if OK, -1 on error.

首先,如果oset是一个非空指针,那么当前进程的信号掩码将会通过oset返回.

其次,如果set是一个非空指针,参数how显示了当前信号掩码被修改的方式,图10.13讲述了参数how的可能取值。SIG_BLOCK是一个或操作,而SIG_SETMASK是一个赋值操作,注意SIGKILL与SIGSTOP不可以被阻塞。

how Description
SIG_BLOCK 新的信号掩码是当前信号掩码与set指定的信号集合的组合。即是说,set包含了我们想阻塞的额外的信号.
SIG_UNBLOCK 新的信号掩码是当前信号掩码与set信号集合的补集的交集,也就是说,set包含了我们想要接触阻塞的信号.
SIG_SETMASK 新的信号将会被set传入的信号集替换。

Figure 10.13 使用函数sigprocmask改变当前信号掩码的方法

如果set是一个空指针,那么进程的信号掩码就不会被改变,参数how也将被忽略。

在调用函数sigprocmask以后,如果有任何未被阻塞的信号被挂起,那么这些信号中至少有一个信号会在sigprocmask返回之前被发送到进程。

函数sigprocmask只是为单线程进程定义的,对于多线程进程,系统提供了另外一个函数来操作线程的信号掩码,关于此,我们将在12.8中进行讨论。

Example

图10.14 中的函数用于打印调用进程的信号掩码中的名称,我们将在图10.20以及10.22中的程序中调用该函数.

  1. #include "apue.h"
  2. #include <errno.h>
  3. void pr_mask(const char *str)
  4. {
  5. sigset_t sigset;
  6. int errno_save;
  7. errno_save = errno; /*we can be called by signal handlers*/
  8. if(sigprocmask(0, NULL, &sigset)<0)
  9. {
  10. err_ret("sigprocmask error");
  11. }
  12. else
  13. {
  14. printf("%s", str);
  15. if(sigismember(&sigset, SIGINT))
  16. printf(" SIGINT");
  17. if(sigismember(&sigset, SIGQUIT))
  18. printf(" SIGQUIT");
  19. if(sigismember(&sigset, SIGUSR1))
  20. printf(" SIHUSR1");
  21. if(sigismember(&sigset, SIGALRM))
  22. printf(" SIGALRM");
  23. /*remaining signals can go here */
  24. printf("\n");
  25. }
  26. errno = errno_save; /*restore errno*/
  27. }

来自为知笔记(Wiz)

时间: 2024-08-08 22:09:25

10.12 sigprocmask函数的相关文章

appium初学者,使用之检查appium环境报错Could not detect Mac OS X Version from sw_vers output: &#39;10.12.1’,

这个问题存在的原因就是appium不兼容最新的mac10.12版本. 由于10.12是最新mac版本,appium1.5.3并未提供支持,所以: 在终端输入grep -rl "Could not detect Mac OS X Version from sw_vers output:" /Applications/Appium.app/找出包含的文件并修改版本号. 通过以上命令可以看到以下4个文件中需要修改版本号,加上 '10.12',有些资料需要去掉后面的空格,加上trim()函数,

Metal API随着iOS 10与macOS 10.12新引入的Tessellation特性

Tessellation--中文一般译作"细分曲面",一般用于将由少量顶点构成的面生成细节度更高的面.这其中的原理是将一个三角形或四边形,由GPU根据我们编程的控制点生成规则,自动生成更多的顶点,然后将这些顶点根据一定规则生成更多的三角形.这么一来,我们可以在3D游戏中在远处的敌人使用低模也能做出精细度较高的模型出来了,而且也省顶点数据传输带宽. 在Metal API中,通过tessellation绘制出的图形所走的渲染流水线会与通过传统的顶点着色器所走的渲染流水线会有所不同.Meta

C++Primer 第五版 练习10.12解答

练习10.12:编写名为compareIsbn的函数,比较两个Sales_data对象的isbn().使用这个函数排序一个保存Sales_data对象的vector. 关于这道题的说明:初看,这道题好像难度系数不高,而且我想许多人的第一印象,应该是可以过了吧,但等我真正去写这道题的时候,才发现,自己真是too young,too simple了,确实,按照题面确实不难,咋一看,把前面一题写的拿过来用就好了.但你真的去写了,就会发现,前面坑无数,尤其是第一次写这道题. 1.首先,按题目要求,定义c

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

黑苹果10.12 sierra 安装笔记

先上成果 再说感慨 有钱还是直接上mbp或者imac吧,比较折腾. 当然不想太折腾又想装黑苹果,也是可以滴.去 Tonymacx86根据配置单攒机,照着教程做,会节省不少时间,我是早就买台式机了,所以不能照那个来 软硬件准备 台式机 cpu:i7-4790k 主板:华硕 z87-k 显卡:hd4600 网卡:淘宝买的兼容黑苹果的usb网卡 显示器连接线:hdmi或者dvi线(vga基本黑屏) 软件工具都放到百度盘里https://pan.baidu.com/s/1hs1dfvA 制作u盘系统盘

Mac OS X 10.12.5下Anaconda中JupyterNotebook出现&quot;不理解“open location”信息。 (-1708)&quot;错误的解决方法

在更新Mac OS X 10.12.5后,发现当通过Anaconda打开JupyterNotebook时出现了以下错误,而且JupyterNotebook并没有通过浏览器启动 我们退出Anaconda,系统提示是否退出JupyterNotebook,这说明JupyterNotebook已经在8888端口上运行了 我们在浏览器地址栏输入(http://localhost:8888)就可以跳转到JupyterNotebook页面,但此时我们会发现页面要求我们输入密码 但这个密码之前并没有被设置过,尝

xxx.app已损坏,打不开.你应该将它移到废纸篓 macOS 10.12 Sierra

出现这个问题的解决方法: 修改系统配置:系统偏好设置... -> 安全性与隐私.修改为任何来源 如果没有这个选项的话 (macOS Sierra 10.12) ,打开终端,执行 sudo spctl --master-disable 即可. 重点是这一行命令: sudo spctl --master-disable Rference MAC应用无法打开或文件损坏的处理方法

Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统 + Parallels Desktop 12 Pro Edition)

Hadoop2.7.3 多台主机完全分布式搭建(Mac OS X 10.12.4系统) 前言 由于学校课程实验的要求,特意需要搭建hadoop的完全分布式系统,所以自己就蛋疼的配了,可惜关于MAC系统的Hadoop搭建材料太少,而且真正的基于校园网的配置基本上没有(基本是在一台电脑上进行,因此当在多台电脑上运行会有许多bug),因此这里想要能够将自己搭的过程想要分享给大家,可能有些配置的解释没有那么全面,所以希望大家见谅?? 环境 基于Mac OSX 10.12.4(Sierra).Ubuntu

解决 VMWARE MAC 10.12无法全屏的问题

昨天我在VMware上装了10.10,然后通过APP store 升级了系统到 10.12,升级前安装VMware tools 能自动全屏,可是升级后不行. 然后在网上查了很多资料,发现并没有这方面的解释,所以我写一下自己的解决步骤. 导致这个的原因是因为苹果在OSX 10.11上启动了一个System Integrity Protection (SIP),这个保护系统防止/library/preferences/systemconfiguration/com.apple.Boot.plist