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

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.lryc.cn/news/479456.html

相关文章:

  • 享元模式及其运用场景:结合工厂模式和单例模式优化内存使用
  • 【物联网技术】ESP8266 WIFI模块在STA模式下实现UDP与电脑/手机网络助手通信——UDP数据透传
  • 【SQL Server】华中农业大学空间数据库实验报告 实验一 数据库
  • 操作系统页面置换算法Java实现(LFU,OPT,LRU,LFU,CLOCK)
  • Request和Response
  • 【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析
  • (十二)JavaWeb后端开发——MySQL数据库
  • pnpm管理多工作区依赖
  • 如何在本地Linux服务器搭建WordPress网站结合内网穿透随时随地可访问
  • 二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
  • 面粉直供系统|基于java和小程序的食品面粉直供系统设计与实现(源码+数据库+文档)
  • 十四:java web(6)-- Spring Spring MVC
  • Java代码实现策略模式处理支付付款业务
  • unity3d————四元数概念
  • spring相关的面试题
  • STM32外设之SPI的介绍
  • 二十三、Mysql8.0高可用集群架构实战
  • docker file 精简规则
  • 前端加密方式详解与选择指南
  • 【React】条件渲染——逻辑与运算符
  • MATLAB中eig函数用法
  • Chrome(谷歌浏览器中文版)下载安装(Windows 11)
  • Linux 配置JDK
  • 目前主流的人工智能学习框架有哪些?
  • 100种算法【Python版】第57篇——贝叶斯优化算法
  • 在Ubuntu 上实现 JAR 包的自启动
  • 【智能算法应用】哈里斯鹰算法优化二维栅格路径规划问题
  • 单品年销10亿!看麻辣王子是如何布局软文营销为品牌赋能的?
  • 【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
  • C++:模拟实现STL的string