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

相关推荐
j7~3 分钟前
【Linux】三十八.C++ 手写 HTTP 服务器:裸 socket + fork 多进程,从 HTTP 报文解析到浏览器打开网页
linux·网络·网络协议·学习·http·网络编程
傲世仙尊39 分钟前
设计者的取舍-路径fork的诞生与全局文件队列
linux
逐流人43 分钟前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
Tairitsu_H1 小时前
[Linux] 编辑器vim、编译器和动静态链接
linux·vim·gcc·g++·动态链接·静态链接
lzx_0021 小时前
Linux指令(一) 简单了解部分指令
linux
小则又沐风a1 小时前
深入理解TCP协议----滑动窗口,流量控制
linux·网络协议·tcp
bosins11 小时前
WSL2 启动即崩溃?调整超时参数解决 Docker 阻塞问题
linux·docker·wsl
web守墓人11 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
kuroomi12 小时前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
daemon.qiang12 小时前
国内虚拟机对接 Freedesktop:Fork xserver、自建 Runner 与提交 MR 实战
linux·ubuntu·centos·gitlab·开源软件