飞凌嵌入式ElfBoard-进程间的通信之信号处理signal

signal()主要是用于捕获信号,改变进程中对信号的默认行为。信号的处理是异步的,也就是说,不论程序当前正在执行什么代码,当信号到达时,信号处理函数都会立即执行。

1 . 头文件

#include <signal.h>

2.函数原型

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

3.参数

signum:参数指定需要捕获的信号

handler:指定信号处理函数,可以自定义处理信号的方式,也可以使用下列宏定义

SIG_DFL:使用默认的信号处理方式。

SIG_IGN:忽略信号,不进行任何处理。

4.返回值

返回之前的信号处理情况,如果signal函数调用出错则返回 SIG_ERR,并会设置 errno。

5.示例:通过signal()函数注册信号处理函数处理信号

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> void signal_handler(int sig) { printf("this signal number is %d \n",sig); if (sig == SIGTERM) { printf("get SIGTERM!\n"); } if (sig == SIGINT) { printf("get SIGINT!\n"); printf("The signal is restored to default processing!\n"); signal(SIGINT, SIG_DFL); } } int main(void) { signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); while (1) { printf("waiting for signal...\n"); sleep(5); } exit(0); } |

6.运行结果

直接运行程序:

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| waiting for signal... waiting for signal... ^Cthis signal number is 2 get SIGINT! The signal is restored to default processing! waiting for signal... waiting for signal... ^C |

将程序挂载到后台运行:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ./a.out \& #执行命令后台运行程序 \[1\] 201460 waiting for signal... waiting for signal... waiting for signal... kill 201460 #中间执行命令尝试发送SIGTERM信号 this signal number is 15 get SIGTERM! waiting for signal... waiting for signal... $ kill -9 201460 #执行命令彻底杀死进程 1+ Killed ./a.out |

7.代码解析

代码中先定义了一个信号处理函数,对SIGINT和SIGTERM信号进行处理;在信号处理函数中判断当前信号类型,并做出相应的处理;①直接在shell终端中执行程序,用CTRL+C终止进程,第一次收到SIGINT信号进入处理函数会打印相关信息,然后将SIGINT恢复系统默认处理方式,再一次执行CTRL+C就能终止进程。②将进程挂到后台,执行kill <PID> 通过kill命令发送SIGTERM信号给进程,进程会打印相关信息,但是不会恢复系统默认处理方式,所以这个方法不能将进程终止,需要使用kill -9 <PID>向进程发送SIGKILL终止信号来杀死进程。

相关推荐
Jason_zhao_MR26 分钟前
新一代电能数据采集终端方案
linux·人工智能·嵌入式硬件·fpga开发·嵌入式
FITA阿泽要努力30 分钟前
第 1 周·第 3 讲|工具如何交给模型:工具定义、参数与结构化调用
服务器·数据库·python·agent
qetfw39 分钟前
Debian SSH 安全配置:端口、来源限制与免密登录
linux·安全·debian·ssh
东鹏特饮44 分钟前
15个实用Linux运维脚本
linux·运维·shell·脚本·redhat·常用生产脚本
远牧1 小时前
Ubuntu 26 升级踩坑实录:hermes-agent venv 重建全过程
linux·ubuntu·ai·agent
新时代牛马1 小时前
Linux PREEMPT_RT 详解(5.10.268-rt164)
linux·运维·服务器
眼不痛请看我1 小时前
Ubuntu_22.04_LTS虚拟机安装指南
linux·数据库·ubuntu
哎呦,帅小伙哦1 小时前
查看网卡配置连接工具组合——nmcli + nmtui
linux
xiaoye-duck1 小时前
《Linux 网络编程》从 0 手写 Reactor 反应堆(上):拆解 Reactor 架构 —— 连接抽象、Poller 封装与事件派发核心
linux·网络
脚踏实地,坚持不懈!1 小时前
Android 电池健康度检测全流程(驱动 → 内核 → HAL → Framework)
android·linux