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

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.kler.cn/a/385255.html

相关文章:

  • MongoDB Shell 基本命令(三)聚合管道
  • Kubernetes 调度器调度策略的资源分配不均问题如何解决?
  • python画图|hist()函数深层体验
  • 网络安全:构建坚固的数字堡垒
  • 使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
  • 动态规划 —— dp 问题-粉刷房子
  • 【go从零单排】go语言中的指针
  • NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备汇聚公共资源场景方案全析
  • 如何设置 TORCH_CUDA_ARCH_LIST 环境变量以优化 PyTorch 性能
  • AutoOps 使每个 Elasticsearch 部署都更易于管理
  • C#核心(7)索引器
  • 从0开始linux(21)——文件(2)文件重定向
  • Hive 查询各类型专利 Top 10 申请人及对应的专利申请数
  • 记录offcanvas不能显示和关闭的修复方法
  • QT监控文件夹变化(文件增加、删除、改名)
  • B2C分销管理系统(源码+文档+部署+讲解)
  • C++20 STL CookBook 4:使用range在容器中创建view
  • c# 动态lambda实现二级过滤(多种参数类型)
  • 『VUE』21. 组件注册(详细图文注释)
  • Kubernetes时代的APM部署革新:基于Webhook的Agent动态注入
  • docker镜像文件导出导入
  • GPU服务器厂家:AI 赋能科学研究的创新突破
  • 1.每日SQL----2024/11/7
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30
  • 为什么人工智能增强的威胁和法律不确定性成为风险主管最关心的问题
  • 5G智能对讲终端|北斗有源终端|北斗手持机|单兵|单北斗