linux 下 signal() 函数的用法,信号类型在哪里定义的?

---------------------------------------------------
author:      hjjdebug
date:        2024年 11月 07日 星期四 14:47:33 CST
description: linux 下 signal() 函数的用法
---------------------------------------------------

signal 是linux 下最基础的进程通讯机制.
signal 是一种信号, 
信号的类型分系统类型<32 和实时类型>=32
进程收到一种信号时,就会对该信号做出响应,这个响应函数是一个无返回值的函数.

专业说法是信号处理函数:
定义__sighandler_t 是一种无返回值的函数
typedef void (*__sighandler_t)( int );

定义signal 函数有2个输入参数,一个输出参数
__sighandler_t signal(int signum,__sighandler_t handler);
输入参数: 一个信号类型,一个信号处理函数, 返回上一次的信号处理函数.

你可以用signal 函数重置除SIGKILL, SIGSTOP 外的所有信号处理函数.


描述:
1. 第一个参数signum描述了信号类型, signum的宏定义在哪里?
 这可以用gcc 的 -E -dD 宏来查看到,为
 "/usr/include/x86_64-linux-gnu/bits/signum-generic.h"
 可以看到31个系统信号定义

   

2. 第二个参数handler描述了与信号关联的动作,它可以取以下三种值:
  a. 信号处理函数, 一个无返回值的函数地址,用户自定义函数, 
  b. SIG_IGN  ; 其作用是忽略该信号
    实现:
    #define SIG_IGN ((__sighandler_t) 1)
  c. SIG_DFL  ; 其作用是把该信号处理函数恢复到默认

例子:
#include <signal.h>
    
static void sighandler(int sig_no)
{
    printf("\nsig_no:%d\n",sig_no);
    // 可以添加自己的东西,例如打印函数调用栈等
    exit(1);  
}

int main(void)
{
    signal(SIGINT,sighandler);
    signal(SIGTERM,SIG_IGN);    // 忽略信号的用法
    signal(SIGUSR1,sighandler); // signal 10
    ....
}

除了signal函数,还可以调用sigaction函数, 它的功能更强.
sigaction的信号处理函数不仅携带了信号类型,而且还包含其它信息.如发出信号时的执行地址等。
这里就不详细展开了.

对于宏的操作, 可通过预处理命令查看.
看定义可以用-dU,          特点,不给出在哪里定义,即预处理不显示宏定义,但在使用时直接给出了定义.并展开.
看在哪里定义可以用-dD,    特点, 预处理文件展开时展示了宏定义,因而可知道在哪里定义的,但在使用点直接展开了.
两者配合可完美解决问题.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【静态页面】尚品汇 1、设计稿分析及资源准备

目录 1. 准备工作2. 理解设计3. 规划项目结构 1. 准备工作 安装必要的工具&#xff1a;确保你的开发环境已经准备好&#xff0c;包括文本编辑器&#xff08;如 VSCode&#xff09;、浏览器等。获取设计文件&#xff1a;获取UI设计稿或者设计文件链接&#xff0c;并确保可以访问…

基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真。本系统包括PV模块&#xff0c;电池模块&#xff0c;电池控制器模块&#xff0c;MPPT模块&#xff0c;PWM模…

nginx代理 proxy_pass

一、location 包含 location /api/ {proxy_pass http://127.0.0.1:85;} 二、location 不包含 location /api/ {proxy_pass http://127.0.0.1:85/;} 三、locaion 包含 location /api {proxy_pass http://127.0.0.1:85;}四、location 包含 location /api {proxy_pass http://127.…

MongoDB笔记01-概念与安装

文章目录 前言一、MongoDB相关概念1.1 业务应用场景具体的应用场景什么时候选择MongoDB 1.2 MongoDB简介1.3 体系结构1.4 数据模型1.5 MongoDB的特点 二、本地单机部署2.1 Windows系统中的安装启动第一步&#xff1a;下载安装包第二步&#xff1a;解压安装启动1.命令行参数方式…

IMS高压发生器维修高压电源维修XRG100/1000

IMS高压发生器的硬件组成&#xff1a; 高压控制发生器主要由高压发生器和高压控制器两部分组成。高压控制器是控制调节X射线管管电压和管电流的机构,高压发生器是管电压和管电流产生的执行机构,通过高压控制器对高压发生器进行控制调节,通过高压电缆将高压发生器与X射线管连接…

133.鸿蒙基础01

鸿蒙基础 1.自定义构建函数1. 构建函数-[Builder ](/Builder )2. 构建函数-传参传递(单向)3. 构建函数-传递参数(双向)4. 构建函数-传递参数练习5. 构建函数-[BuilderParam ](/BuilderParam ) 传递UI 2.组件状态共享1. 状态共享-父子单向2. 状态共享-父子双向3. 状态共享-后代组…

MybatisPlus入门(八)MybatisPlus-DQL编程控制

一、字段映射与表名映射 数据库表和实体类名称一样自动关联&#xff0c;数据库表和实体类有部分情况不一样。 问题一&#xff1a;表名与编码开发设计不同步&#xff0c;表名和实体类名称不一致。 解决办法&#xff1a; 在模型类上方&#xff0c;使用TableName注解&#xf…

React Native的生命周期

React Native 组件的生命周期分为三个阶段&#xff1a;Mounting&#xff08;挂载&#xff09;、Updating&#xff08;更新&#xff09; 和 Unmounting&#xff08;卸载&#xff09;。每个阶段都会触发不同的生命周期方法。 下面是详细的生命周期解释&#xff0c;并通过一个项目…

RNN中的梯度消失与梯度爆炸问题

梯度消失与梯度爆炸问题 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类具有短期记忆能力的神经网络&#xff0e;在循环神经网络中&#xff0c;神经元不但可以接受其他神经元的信息&#xff0c;也可以接受自身的信息&#xff0c;形成具有…

Trimble X12三维激光扫描仪正在改变游戏规则【上海沪敖3D】

Trimble X12 三维激光扫描仪凭借清晰、纯净的点云数据和亚毫米级的精度正在改变游戏规则。今天的案例我们将与您分享&#xff0c;X12是如何帮助专业测量咨询公司OR3D完成的一个模拟受损平转桥运动的项目。 由于习惯于以微米为单位工作&#xff0c;专业测量机构OR3D是一家要求…

从分析Vue实例生命周期开始,剖析Vue页面跳转背后执行过程

文章目录 1.概要2.Vue实例生命周期3.生命周期函数解释4.存在父子组件情况页面执行过程5. 分析路由跳转页面执行过程6.扩展补充7.小结 1.概要 本文旨在分析Vue页面进行路由切换时&#xff0c;Vue背后的运行过程&#xff0c;旨在让大家更加清晰地明白Vue页面运行过程中钩子方法的…

git提交冲突的原因及解决方案

一、场景一 1.冲突原因 提交者的版本库 < 远程库 要保障提交者的版本库信息和远程仓库是一致的 2.解决方案 实现本地同步git pull,再提交代码&#xff08;最好每次git push之前都git pull一下&#xff0c;防止这种情况的出现&#xff09; 场景二 1.冲突原因 别人跟你…

【LeetCode】【算法】142. 环形链表II

142环形链表II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#x…

mysql批量生成修改数据库中字段类型的语句

假设需要修改数据库中所有datetime类型的字段为date类型SELECT cl.table_name,cl.column_name,cl.data_type,CONCAT("ALTER TABLE ", cl.table_name, " MODIFY COLUMN `", cl

前后端交互接口(一)

前后端交互接口&#xff08;一&#xff09; 前言 在上一集我们就完成了全局通知窗口的功能&#xff0c;这一集开始我们也要开始讲讲前后端交互接口这件事情&#xff0c;以及谈谈客户端和服务端开发的一些事情。 后续的规划 我们会先完成整个客户端才开始接入服务端的内容。…

HT7182 21V,14A高效升压转换器

1、特征 输入电压范围:2.7V-21V 输出电压范围:最高21V 固定开关频率:350kHz 可编程峰值电流:最高14A 高转换效率 95% (PVIN 12V, VOUT20V, IOUT 2A) 94% (PVIN 12V, VOUT20V, IOUT 4.5A) 93% (PVIN 7.2V, VOUT12V, IOUT 1.5A) 90% (PVIN 7.2V, VOUT12V, IOUT 5A) 96% (PVI…

【SNTP】Simple Network Time Protocol

SNTP&#xff08;Simple Network Time Protocol&#xff09;客户端是一种用于从时间服务器获取网络时间的应用程序或设备。SNTP是一种基于UDP的协议&#xff0c;它用于同步计算机和设备的本地时间与网络中的标准时间。 SNTP客户端通常用于以下情况&#xff1a; 时间同步&#…

python中对字典的遍历

python中,对字典的遍历很有用,平常编程中可能经常会用到。下面是几种常用的方法。 1. for循环遍历 stu_info = {"name": lily, "age": 18, "height": 170, "weight": 50}# 遍历方法1 for i in stu_info: # 这种其实是遍历键print…

解析Eureka的架构

1. 引言 1.1 Eureka的定义与背景 Eureka是由Netflix开发的一个RESTful服务&#xff0c;用于服务发现。它是微服务架构中的一个核心组件&#xff0c;主要用于管理服务的注册和发现。Eureka允许服务提供者注册自己的服务信息&#xff0c;同时也允许服务消费者查询可用的服务&am…

《野狗子:裂头怪》角色升级注意事项分享

《野狗子&#xff1a;裂头怪》中的角色升级是游戏里非常重要的事情&#xff0c;不过升级需要注意的事情就是如果你找到一个自己喜欢的角色&#xff0c;我们强烈建议你查看他们的所有被动技能&#xff0c;并尽早解锁一些! 野狗子裂头怪角色升级需要注意什么 在《野狗子 Slitter…