当前位置: 首页 > news >正文

【计算机网络】信号处理接口 Signal API(1)

         收发信号思想是 Linux 程序设计特性之一,一个信号可以认为是一种软中断,通过用来向进程通知异步事件。

        本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解信号编程。


signal

遵循 C11,POSIX.1 - 2008

1.库

标准 c 库,libc, -lc

2.头文件

<signal.h>

3.接口定义

       #include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

4.接口描述

       注意:signal() 的行为会根据不同的 UNIX 版本而变化,同样它也会根据 Linux 版本的不同而不同。考虑到程序的可移植性,尽量避免 signal() 的使用,而是使用 sigacton(2) 代替,可以参考下面移植性部分。

        signal() 设置 signum 信号的处理函数为 handler,处理函数可以是SIG_IGN、SIG_DFL,也可以是程序设计人员定义的函数地址。

        如果 signum 被分发给到一个进程,那么会发生以下行为:

  • 如果处理函数设置成了 SIG_IGN,那么信号会被忽略。
  • 如果处理函数设置成了 SIG_DFL,那么信号的默认关联行为会发生(可以参考 signal(7))。
  • 如果处理函数设置成了一个函数,那么首先会将默认处理函数复位为 SIG_DFL,或者信号被阻塞(参考下面可移植性部分),然后会调用 handler 函数并传递 signum 参数。如果处理函数调用导致了该信号处理阻塞,那么在处理函数返回后,该信号会重新被 unblock。

        SIGKILL 和 SIGSTOP 两个信号不能被捕捉或者忽略。

5.返回值

        signal() 返回信号之前 的处理函数值。发生错误时,signal() 会返回 SIG_ERR,并设置 errno 来提示具体错误。

        错误值定义如下:

EINVALsignum 参数不合法

6.版本

       sighandler_t 是一个 GNU 扩展,它会在 _GNU_SOURCE 定义时暴漏出来。如果定义了_BSD_SOURCE(glibc 2.19 或低版本) 或者 _DEFAULT_SOURCE(glibc 2.19 或高版本),glibc 也定义了 sig_t。不使用这些定义的情况下,signal() 的声明就会有些晦涩:

           void ( *signal(int signum, void (*handler)(int)) ) (int);

可移植性 

        signal() 只有在将 handler 设置为 SIG_DFL/SIG_IGN 时,才具有移植性。使用 signal() 建立信号处理函数的语义随着系统的不同而不同,POSIX.1 明确允许这些不同的行为。所以不要使用它于此目的。

        POSIX.1 通过 sigaction(2) 接口解决了这种移植上的混乱,sigaction(2)  提供了信号处理调用的明确语义定义。所以,使用 sigaction(2) 来代替 signal()。

7.历史

        C89,POSIX.1-2001

        在原来的 UNIX 系统中,当使用 signal() 建立的信号处理函数被调用时,信号的处理会被设置成 SIG_DFT,并且系统不会阻塞该信号通往其他进程的发布。这相当于调用了 sigaction(2),附带以下标记:

           sa.sa_flags = SA_RESETHAND | SA_NODEFER;

         System V 已提供了 signal() 的语义,不过这个定义有点差劲,因为在处理函数重新建立连接前,可能会连续收到两个信号。更严重的,同一个信号的频繁分发会导致处理函数的递归调用。

        BSD 对此进行了改善,但不幸的是这种改善却改变了现存 signal() 接口的语义。在 BSD 系统上,当一个处理函数调用时,信号处置并没有被重新设置,后面发生的该信号的实例因该处理函数正在执行无法进行分发。更严重的,一些阻塞系统调用会在信号处理函数打断后自动重启。BSD 语义相当于使用下面标记调用 sigaction(2):

           sa.sa_flags = SA_RESTART;

         Linux 上的情景如下:

  • 内核的 signal() 系统调用提供了 System V 语义
  • 默认情况下,glibc 2 及更高版本的 signal() 封装并没有调用内核系统调用,而是调用了 sigaction(2),提供 BSD 语义的标记。只要提供合适的宏定义,就可以提供以上默认行为:glibc 2.19 或低版本的 _BSD_SOURCE 或者 2.19 或更高版本的 _DEFAULT_SOURCE。(默认情况下,这些宏是定义了的,参考 feature_test_macros(7) )。如果这些测试宏没有开启,那么 signal) 提供的是 System V 语义。 

 8.注意

        signal() 在进程的多线程场景下的副作用是未定义的。

        根据 POSIX 定义,进程忽略非 kill(2)/raise(3) 产生的 SIGFPE/SIGILL/SIGSEGV 信号后的行为是未定义的。整数除以 0 是未定义的结果,在一些架构上它会产生 SIGFPE 信号(同样使用 -1 除最大负整数也可能产生 SIGFPE。)忽略这些信号可能会导致无限循环。

        参考 sigaction(2) 获取更多关于将 SIGCHLD 信号的处置设置为 SIGIGN 的信息。

        参考 signal-safety(7) 来查看一些可以在信号处理函数内部调用的异步信号安全的函数。

9.代码

        下面是一个捕捉 CTRL + C 信号的程序。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>void sighandler(int);int main()
{signal(SIGINT, sighandler);while(1) {printf("开始休眠一秒钟...\n");sleep(1);}return(0);
}void sighandler(int signum)
{printf("捕获信号 %d,跳出...\n", signum);exit(1);
}

下一篇 【计算机网络】信号处理接口 Signal API(2)​​​​​​​

相关文章:

【计算机网络】信号处理接口 Signal API(1)

收发信号思想是 Linux 程序设计特性之一&#xff0c;一个信号可以认为是一种软中断&#xff0c;通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解信号编程。 signal 遵循 C11&#xff0c;POSIX.…...

贝叶斯滤波计算4d毫米波聚类目标动静属性

机器人学中有些问题是二值问题&#xff0c;对于这种二值问题的概率评估问题可以用二值贝叶斯滤波器binary Bayes filter来解决的。比如机器人前方有一个门&#xff0c;机器人想判断这个门是开是关。这个二值状态是固定的&#xff0c;并不会随着测量数据变量的改变而改变。就像门…...

华为hcie认证考试怎么考?

华为HCIE认证考试怎么考&#xff1f; 前文腾科也说了HCIE认证考试的难度会比较大&#xff0c;具体是难在哪里呢&#xff1f;华为HCIE认证的考试需要考一门笔试&#xff0c;笔试主要是单选、多选、判断、填空、拖拽这几个题型&#xff0c;考试时长一般是一个半小时&#xff0c;…...

vue +element 删除按钮操作 (删除单个数据 +删除页码处理 )

1.配置接口deleteItemById: "/api/goods/deleteItemById", //删除商品操作 2.get请求接口 // 删除接口 后台给我们 返iddeleteItemById(params){return axios.get(base.deleteItemById,{params})}3.异步请求接口 async deleteItemById(id){let res await this.…...

更新GitLab上的项目

更新GitLab上的项目 如有需要&#xff0c;请参考这篇&#xff1a;上传项目到gitlab上 1.打开终端&#xff0c;进入到本地项目的根目录。 2.如果你还没有将远程GitLab仓库添加到本地项目&#xff0c;你可以使用以下命令&#xff1a; 比如&#xff1a; git remote add origin …...

K8S群集调度

K8S群集调度 一、调度约束1.概述2.Pod 启动典型创建过程&#xff08;工作机制 &#xff09;3.调度过程4.Predicate 的常见的算法5.常见的优先级选项6.指定调度节点&#xff1a; 二、亲和性1.节点亲和性2.Pod 亲和性3.键值运算关系4.示例5.Pod亲和性与反亲和性6.使用 Pod 反亲和…...

完美解决Echarts X坐标轴下方文字最后一个字体加粗颜色加深的问题

之前用Echarts画图的时候&#xff0c;X坐标轴最后一个字存在自动加粗的问题。也是在网上找过解决办法没有找到&#xff0c;后面自己研究明白了后&#xff0c;在某篇文章下评论了如何解决。但是好像大家没有看评论的习惯&#xff0c;所以单独拿出来一篇文章&#xff0c;希望能给…...

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…...

解决SpringMVC在JSP页面取不到ModelAndView中数据

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 问题描述 ModelAndView携带数据跳转到指定JSP页面后在该页面通过EL表达式取不到原本存放在ModelAndView中的数据。 问题原因 在IDEA中创建Maven工程时web.xml中默认的约束…...

Spring 6.0 新特性

文章目录 Spring的发展历史AOTGraalVMSpringBoot实战AOTRuntimeHints案例分析RuntimeHintsRegistrar SpringBoot中AOT核心代码 Spring的发展历史 AOT Spring 6.0的新特性Ahead of Time&#xff08;AOT&#xff09;编译是一种技术&#xff0c;可以提前将Spring应用程序编译成原…...

计算机竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…...

软件过程能力成熟度评估——CSMM认证

CSMM认证又称为“软件过程能力过程成熟度评估”&#xff0c;由中国电子技术标准化研究院联合五十余家产学研用相关方结合我国实际&#xff0c;自主制定的团体标准&#xff0c;于2021年6月8号发布&#xff0c;目的是为了帮助国内软件企业对自身的软件能力进行评估和判断&#xf…...

学内核之二十一:系统调用栈结构分析

目录 一 构建分析环境 二 栈的位置 三 栈开头8字节 四 寄存器环境 五 R4和R5 六 如何确定系统调用的具体函数 一 构建分析环境 为了分析方便&#xff0c;做了如下测试环境&#xff1a; 内核实现一个简单的创建字符设备的驱动 应用层实现一个c程序&#xff0c;操作为打开内…...

互联网3.0 数字原生——数物虚实多维细粒度泛在融合

随着计算机、宽带网、通信技术的飞速发展&#xff0c;互联网技术和软硬件系统也不断演进&#xff0c;催生了一场前所未有的数字化革命。从Web1.0到Web3.0&#xff0c;以及虚拟现实、人工智能和数字孪生等领域的崛起&#xff0c;每一步都勾画出了一个崭新的数字未来&#xff0c;…...

实现AIGC更好的数据存力,这家科技巨头为我们指明了方向

存力即数据存储能力 蕴藏着巨大的发展机会 【全球存储观察 &#xff5c; 热点关注】 2023年&#xff0c;全球被ChatGPT的热潮席卷&#xff0c;拥抱AIGC的创新赛道成为众多企业的新选择。 全球存储观察分析指出&#xff0c;影响AIGC发展的三大因素也日益凸显&#xff0c;即算…...

企业如何在抖音上搞到TOB潜在精准客户流量?

我们都知道&#xff0c;现在互联网上流量都被集中了几个大的平台里。而抖音&#xff0c;一定是绕不开那个&#xff01;图片在公众号&#xff1a;白杨SEO上去看。 抖音&#xff0c;在很多人的传统印象里&#xff0c;还只是一个娱乐短视频APP&#xff0c;用来打发时间而已。事实…...

JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…...

与树上边权、连通块、二分块相关的问题(抓住各连通块之间的联系,考虑增量):CF444E

https://www.luogu.com.cn/problem/CF444E 首先肯定二分 然后是棵树&#xff0c;所以考虑按顺序枚举边权 然后肯定会有连通块和并查集 考虑现在场上有多个连通块&#xff0c;我们只保留大于 m i d mid mid 的边 则每个连通块都必须往外连边 一个很朴素的思路是判定每个连…...

解决VSCode下载速度很慢

这是VSCode的官网&#xff1a; Visual Studio Code - Code Editing. Redefined 按照官网的下载链接&#xff0c;速度实在是感人&#xff01; 解决办法也很简单&#xff0c;把链接换为CDN加速的链接 把下载链接中的az764295.vo.msecnd.net 替换为&#x1f449; vscode.cdn.azu…...

悬赏算命测算源码可以用二维码收款 可以直接拿来运营

首发悬赏算命测算源码可以用二维码收款 可以直接拿来运营吸金&#xff01;用户可以通过发布悬赏赏金算命&#xff0c;也可以通过升级发布测算任务来吸金 测试环境&#xff1a;php5.6apache2.4mysq5.6 安装教程&#xff1a; 测试环境&#xff1a;php5.6apache2.4mysq5.6 安装&…...

在Linux中安装nginx-1.20.1+php-7.4.28(增加扩展)

NginxPHP安装在公网IP为x.x.x.x的服务器上 需要下载安装的软件版本&#xff1a;nginx-1.20.1php-7.4.28 需要增加的PHP扩展如下&#xff1a; 在编译安装php-7.4.28时加上的pcntl&#xff1b; 单独下载安装的Wxwork_finance_sdk&#xff1b;&#xff08;在编译安装php-7.4.2…...

使用vue-cli搭建SPA项目

一.SPA项目的构建 前提 nodeJS环境已经搭建完毕 node -v npm -v 什么是SPA项目 SPA&#xff08;Single Page Application&#xff09;项目是一种使用单页面架构的Web应用项目。在SPA项目中&#xff0c;整个应用程序只有一个HTML页面&#xff0c;通过动态加载数据和更新DOM来实…...

PLC串口通讯和通讯接口知识汇总

在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f; 一、什么是串口通讯&#xff1f; 串口是一种接口标准&#xff0c;是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准&#xff0c;没…...

Vue基础入门---详细简介

一&#xff0c;对Vue的概念 1.1 什么是Vue &#xff1f; 一种流行的JavaScript前端框架&#xff0c;用于构建交互式的Web应用程序。它以简洁、灵活和高效的特性而受到广泛欢迎。Vue采用了一种响应式的数据绑定机制&#xff0c;使得数据的变化能够自动更新相关的DOM元素&#x…...

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度&#xff0c;暂时停滞使用&#xff0c;重写了QTreeWidget的拖拽功能&#xff0c;和绘制功能&#xff0c;自定义了数据结构&#xff0c;增加复制&#xff0c;粘贴&#xff0c;删除&#xff0c;准备实现动态刷新数据支持千万数据动态刷新&a…...

【Spring Boot】拦截器学习笔记

一、普通拦截器 1&#xff0c;新建类MyWebConfig实现WebMvcConfigurer&#xff0c;实现addInterceptors方法 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry// 不拦截哪些请求.excludePathPatterns("/login")// 拦截哪些请求.addPat…...

云可观测性:提升云环境中应用程序可靠性

随着云计算的兴起和广泛应用&#xff0c;越来越多的企业将其应用程序和服务迁移到云环境中。在这个高度动态的环境中&#xff0c;确保应用程序的可靠性和可管理性成为了一个迫切的需求。云可观测性作为一种解决方案&#xff0c;针对这一需求提供了有效的方法和工具。本文将介绍…...

免杀对抗-java语言-shellcode免杀-源码修改+打包exe

JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令&#xff1a;msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包&#xff0c;成功上线 命令&#xff1…...

抖音、知乎、小红书的流量算法

目前我国网民规模已超过10亿&#xff0c;在这互联网时代&#xff0c;更是流量为王。各个平台里的每个视频、每张图片&#xff0c;背后都有着算法的身影&#xff0c;支配着所有人的流量。作为内容创作者及运营者来说&#xff0c;除了制作高质量的内容以外&#xff0c;也需要掌握…...

c++ 纯虚函数、抽象类

一、 纯虚函数 抽象类 只要有一个纯虚函数&#xff0c;这个类称为抽象类 抽象类的特点 1、无法实例化 2、抽象类的子类&#xff0c;必须要重写父类中的纯虚函数&#xff0c;否者也属于抽象类 例子一 #include <iostream> #include <string.h> using namespa…...

轮网站开发的重要性/资源优化网站排名

计算机能力挑战赛总结一、赛题1. 设计目标2. 基本要求3. 扩展要求4. 发挥要求二、分析1. 基本要求-车载娱乐播放2. 基本要求-车载仪表显示3. 扩展要求-音频录制4. 扩展要求-歌曲列表5. 扩展要求-汽车黑匣子6. 发挥要求-移动互联功能7. 发挥要求-智能语音控制三、制作四、结果五…...

一键生成房屋设计图/seo服务公司

症状&#xff1a; 前几天从ubuntu14.10升级到15.04&#xff0c; 升级的过程中都挺正常&#xff0c;但是升级完成以后突然发现没有声音&#xff0c;完全的没有声音。找了很多办法都没有解决&#xff0c;直到今天才找到这个解决办法&#xff1a; 解决办法&#xff1a; 打开te…...

小程序做网站登录/网站怎么推广出去

题目大意$\newcommand{\SD}{\mathrm{SD}}$ 给定一个 $n1$ 个点的有向无环图&#xff0c;点从 $0$ 开始编号。无重边、自环&#xff0c;且从每个点 $u$ 都能到达 $0$ 号点。如果每条 $u\leadsto 0$ 路径&#xff08;$u\ne 0$&#xff09;都经过点 $v$ &#xff08;$v\ne 0$ 且 $…...

杭州手机网站制作电脑公司/seo关键词优化技术

用pytorch构造简单的线性模型 import torch# prepare dataset # x,y是矩阵&#xff0c;3行1列 也就是说总共有3个数据&#xff0c;每个数据只有1个特征 "先准备数据集&#xff0c;x_data, y_data" x_data torch.tensor([[1.0], [2.0], [3.0]]) y_data torch.tenso…...

做别人公司的网站违法吗/泽成杭州seo网站推广排名

UI Recorder功能介绍 支持所有用户行为: 键盘事件, 鼠标事件, alert, 文件上传, 拖放, svg, shadow dom支持无线native app录制, 基于macaca实现: https://macacajs.com/无干扰录制: 和正常测试无任何区别&#xff0c;无需任何交互录制用例存储在本地支持丰富的断言类型:val,te…...

免费做抽奖的h5网站/青岛seo网站排名优化

题目链接&#xff1a; C - Bowls and Disheshttps://atcoder.jp/contests/abc190/tasks/abc190_c 观察到k最大是16&#xff0c;n最大是100&#xff0c;2^16大概是6万多&#xff0c;再乘个100也不算太大&#xff0c;所以考虑爆搜。 可以用dfs&#xff0c;也可以用二进制枚举 …...