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

相关推荐
用户311879455921818 小时前
Kylin Linux 10 安装 glib2-devel-2.62.5-7.ky10.x86_64.rpm 方法(附安装包)
linux
涛啊涛19 小时前
Centos7非LVM根分区容量不足后扩容,对调硬盘挂载/
linux·磁盘管理
CYRUS_STUDIO2 天前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
熊猫李2 天前
rootfs-根文件系统详解
linux
dessler2 天前
Hadoop HDFS-高可用集群部署
linux·运维·hdfs
泽泽爱旅行2 天前
awk 语法解析-前端学习
linux·前端
轻松Ai享生活3 天前
5 节课深入学习Linux Cgroups
linux
christine-rr3 天前
linux常用命令(4)——压缩命令
linux·服务器·redis
三坛海会大神5553 天前
LVS与Keepalived详解(二)LVS负载均衡实现实操
linux·负载均衡·lvs
東雪蓮☆3 天前
深入理解 LVS-DR 模式与 Keepalived 高可用集群
linux·运维·服务器·lvs