飞凌嵌入式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终止信号来杀死进程。

相关推荐
HMS工业网络1 小时前
技术干货:EtherCAT设备ESI(XML)文件中的CompleteAccess关键字有什么作用
xml·运维·服务器
汽车仪器仪表相关领域1 小时前
HORIBA MEXA-584L 全功能汽车排放废气分析仪:便携精准排放检测 + 多参数同步测量 + 国六 / 欧 7 合规适配,汽车检测与调校的黄金标准
服务器·数据库·人工智能·功能测试·汽车·压力测试·可用性测试
Irene19911 小时前
Linux 中换行符 = 命令结束,xargs 防止意外执行的机制,不支持标准输入的命令,-i 在各个命令中的真实含义
linux
TechWayfarer1 小时前
账号安全实战:基于IP归属地基线的三原则异地登录风控模型
服务器·网络·python·安全·网络安全
Edward111111111 小时前
SSL/TSL配置 集群节点间通信加密还有客户端
linux·服务器·ssl
189228048611 小时前
NV232固态闪存MT29F32T08GWLBHD6-TES:B
大数据·服务器·人工智能·科技·缓存
Codigger官方2 小时前
Ubuntu 与 Fedora:两大 Linux 发行版怎么选?
linux·运维·ubuntu
189228048612 小时前
NV231美光闪存MT29F32T08GWLBHD6-MES:B
大数据·服务器·人工智能·科技·缓存
程序员老舅2 小时前
Linux:谁把根目录卸载了?
linux·c++·容器·linux内核·文件系统·根目录