• 正文
  • 相关推荐
申请入驻 产业图谱

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

05/15 11:04
201
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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终止信号来杀死进程。

相关推荐