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

相关推荐
cominglately3 小时前
centos单机部署seata
linux·运维·centos
魏 无羡3 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse3 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux4 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8244 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维4 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs
watermelonoops4 小时前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
滴水之功5 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
ldinvicible5 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr6 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu