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

相关推荐
zhouwu_linux6 分钟前
MT7628基于原厂的SDK包, 修改ra1网卡的MAC方法。
linux·运维·macos
2401_8979300615 分钟前
linux系统如何配置host.docker.internal
linux·docker·eureka
诶尔法Alpha25 分钟前
Linux上使用dify构建RAG
linux·运维·服务器
熬夜苦读学习1 小时前
Linux文件系统
linux·运维·服务器·开发语言·后端
沐千熏1 小时前
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
linux·mysql·centos
黑牛先生3 小时前
【Linux】匿名管道
linux·运维·服务器
流星白龙3 小时前
【Linux】35.封装 UdpSocket(2)
linux·运维·windows
是码农没错了3 小时前
银河麒麟系统安装mysql5.7【亲测可行】
linux·运维·kylin
wzhao1013 小时前
WSL进阶使用指南
linux
风静如云3 小时前
OpenBMC:BmcWeb app.run
linux