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个系统信号定义

  1. 第二个参数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 , 特点, 预处理文件展开时展示了宏定义,因而可知道在哪里定义的,但在使用点直接展开了.
两者配合可完美解决问题.

相关推荐
Johny_Zhao1 天前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
chlk1233 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑3 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件3 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号3 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash3 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI4 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行5 天前
Linux和window共享文件夹
linux
木心月转码ing5 天前
WSL+Cpp开发环境配置
linux
崔小汤呀6 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端