信号——产生、处理、捕捉、接收、阻塞

2023-11-15

一个信号是一条小消息,它通知系统进程中发生了一个某种类型的事件,提供了一种处理异步事件的方法。

每一种信号都有一个名字,在头文件<signal.h>中,信号名都被定义为正整数常量。1~31号实时普通信号和34~64号实时信号


每种信号类型都对应某种系统事件,低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程是不可见的。信号提供一种机制,通知用户进程发生了这些异常。

那么信号是如何产生的?

1.用户按某些终端键时,引起终端发生的信号。比如:在终端按delete(或ctrl+c)通常产生中断信号。

2.硬件异常产生信号。比如:除0,无效的内存引用等。

3.进程调用kill函数可将任意发送给另一个进程或进程组。

4.当检测到某种软件条件条件已发生,并应将其通知有关进程时也产生信号。

信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能简单的测试一个变量来判断是否发生了一个信号,而是必须告诉内核“在此信号发生时,请执行下列操作”。

当某个信号出现时,可以告诉内核按照下列3种方式之一进行处理。

1.忽略此信号(9和19号不能被忽略)

2.捕捉此信号,执行自定义工作。(9和19不能被捕捉,它们是管理员的信号)

3.执行系统默认动作。大多数信号的系统默认动作是终止该进程。

捕捉信号:

如果信号的处理动作是用户自定义函数,在信号抵达时就调用这个函数,这称为信号捕捉。

下图给出了信号处理程序捕捉信号的基本思想:



接收信号:

当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。进程可以忽略这个信号,也可以通过执行一个称为“信号处理程序”的用户层函数来捕捉这个信号。 

一个发出而没有被接受的信号叫做待处理信号。在任何时候,一种信号都只有一个待处理信号。如果一个进程有一个类型为K的待处理信号,那么任何接下来发送到这个进程的类型为K的信号都不会排队,它们会被简单的抛弃,知道进程取消对这种信号的阻塞。

那么,系统是如何控制一个处理信号只被接受一次的呢?  内核为每个进程在pending位向量中维护着一个待处理信号的集合,而在blocked位向量中维护者被阻塞的信号集合。只要传送了一个类型为K的信号,内核就会清楚pending的第K位。

 阻塞信号:

进程可以选择阻塞某个信号。被阻塞的信号发生时将保持在未决状态,知道进程解除对此信号的阻塞,才执行抵达的动作。当信号被阻塞时,它仍可以被发送,但是产生的待处理信号不会被接受。

linux提供两种阻塞信号的机制:(1)隐式阻塞机制。内核默认阻塞任何当前处理程序正在处理信号类型的待处理的信号。(2)应用程序可以使用sigpromask函数和它的辅助函数,明确的阻塞和解除阻塞选定的信号。

下面,我用信号的几个接口函数写了一个mysleep模拟实现sleep的功能。

  1 #include<stdio.h>
  2 #include<signal.h>
  3 #include<unistd.h>
  4 
  5 void sig_alrm(int signo)
  6 {
  7    //do nothing
  8 }
  9 
 10 
 11 unsigned int mysleep(unsigned int nsecs)
 12 {
 13   struct sigaction new,old;
 14   unsigned int unslept = 0;
 15   new.sa_handler = sig_alrm;
 16   sigemptyset(&new.sa_mask);
 17   new.sa_flags = 0;
 18   sigaction(SIGALRM,&new,&old);
 19   alarm(nsecs);
 20   pause();
 21   unslept = alarm(0);
 22   sigaction(SIGALRM,&old,NULL);
 23   return unslept;
 24 }
 25 
 26 
 27 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信号——产生、处理、捕捉、接收、阻塞 的相关文章

  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 具有少量父设备属性的 udev 规则

    我需要复杂且通用的udev规则来确定插入任何 USB 集线器的特定端口的 USB 设备 所以 我必须结合设备树不同层的父属性 我有这个 udevadm info query all name dev ttyUSB0 attribute wa
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • android — NDK生成so文件

    我们在安装环境的时候安装了NDK 可以在eclipse下直接生成so文件 NDK的压缩包里面自带了一些sample工程 NDK的文件直接解压到某个目录下即可 第一次生成so文件的时候 我们先使用NDK的sample下的hello jni的例
  • 【栈】逆波兰计算器

    文章目录 前言 一 基本概念 1 1 介绍 1 2 入栈和出栈示意图 1 3 栈的应用场景 二 使用数组模拟栈 2 1 思路分析 2 2 代码实现 2 3 测试 三 使用栈模拟中缀表达式计算器 3 1 整体思路 3 2 验证3 2 6 2
  • Qt基本窗口

    窗口类 1 Qt中最经常被使用的窗口类是QWidget QDialog 其中QDialog是继承于QWidget 它是一个顶级窗口 不能附着在其他QDialog上面 一般情况下QDialog基本都是用 在弹出窗口需求中被使用 而QWidge
  • OpenGL中光源的三种移动区别

    1 光源不动 需要在设置完视图模型变换之后 然后再设置光源的位置并且开启 伪代码如下 glmatrixmode gl projection glloadidentity xxxxxxxxxx glmatrixmode gl modelvie
  • Vue 移动端、PC 端适配

    Vue 移动端 PC 端适配可以使用 lib flexible amfe flexible postcss pxtorem postcss px2rem 和 postcss px to viewport 这几个插件 lib flexible
  • BLE蓝牙协议 — BLE连接建立过程梳理(一)

    文章出处 枫之星雨 转载文章 如有不妥 通知后我会立即删除 连接建立 应付比广播更为复杂的数据传输 或者要在设备之间实现可靠的数据交付 这些都要依赖于连接 连接使用数据信道在两个设备之间可靠地发送信息 它采取了自适应跳频增强鲁棒性 同时使用
  • Idea:applicationcontext in module file is included in 5 contexts

    今天使用IDEA做项目的时候出现了这个东西 经过查询资料 应该是编译器自动导入配置文件的时候发生了某些错误 提示修正 解决方法 依次打开 Project Settings gt Modules gt Spring 按减号删除右侧所有文件 然
  • 国产ChatGpt、AI模型盘点

    个人中心 DownLoad 一 百度 文心一言 百度的文心一言是一款基于深度学习技术的自然语言生成模型 能够生成各种类型的文本 包括新闻 小说 诗歌等 它采用了Transformer模型和GPT 2模型 能够生成高质量的文本 并且速度非常快
  • 2022-1-12 java运算符的学习记录

    2022 1 12 java运算符的学习记录 算数运算符 在java中有i 和 i俩种操作 前一种是先使用变量再自增 后一种是先自增再使用变量 因为java是强运算符号 所以不同的类型的变量加减 最终会趋向于高等级的类型的运算类型 是取整符
  • vggNet网络学习(网络架构及代码搭建)

    原论文 翻译链接 VERY DEEP CONVOLUTIONAL NETWORKSFOR LARGE SCALE IMAGE RECOGNITION VGGnet论文翻译 附原文 机器学习我不学习的博客 CSDN博客 网络架构 vggnet
  • 巨人互动

    游戏出海是指将原本面向国内市场的游戏产品进行调整和优化 以适应海外市场的需求 并进行推广和销售 下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点 1 市场扩大 通过游戏出海 可以将游戏产品的目标受众从国内扩展到全球范围内 从而获得更多
  • 前后端node设置art-template,以及express后端搭建

    前后端node设置art template 以及express后端搭建 首先全局安装express generator yarn add express generator g express e npm i yarn add cross
  • 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一 配置问题分析及解决方案 1 问题分析 2 解决方案 二 Spring Cloud Config 介绍 1 Spring Cloud Config特性 2 Spring Cloud Config作用 3 Spring Cloud C
  • 希尔排序(ShellSort)

    最后分析的基于比较的排序 之所以放在前面几个排序算法之后主要是因为虽然希尔排序很容易编写却很难分析 尤其是它的时间复杂度 希尔排序思想的提出是有原因的 在那个排序还基本都是2次型 插入 选择 冒泡 的年代 当人们经常使用 插入排序时发现有时
  • Kafka实战——简单易懂的生产者消费者demo

    单线程版本适合本地调试 多线程版本适合做压测 1 引入maven依赖
  • 泊松分布的矩母函数与特征函数

    矩母函数与特征函数 矩 母 函 数 与 特 征 函 数
  • 【企业了解】人人都是产品经理、鸟哥笔记、CSDN、稀土掘金(2020年11月稀土掘金被字节跳动,金融与科技)

    企业了解 人人都是产品经理 鸟哥笔记 CSDN 稀土掘金 前言 今天早上看 今日热榜官网 的时候 被一篇文章吸引 中国成功学迭代史 内容挺有意思的 然后发现这篇文章来自一个网站 人人都是产品经理 和我上次写 企业分析 鸟哥笔记 一样 我因为
  • Hive三种不同的数据导出的方式

    Hive三种不同的数据导出的方式 1 导出到本地文件系统 insert overwrite local directory home anjianbing soft export data app order city d row form
  • 2021-09-22

    linux防火墙查看状态 操作防火墙的命令 查看防火墙状态 systemctl status firewalld 让防火墙可用 systemctl enable firewalld 让防火墙不可用 systemctl disable fir
  • 信号——产生、处理、捕捉、接收、阻塞

    一个信号是一条小消息 它通知系统进程中发生了一个某种类型的事件 提供了一种处理异步事件的方法 每一种信号都有一个名字 在头文件