Linux--信号

2023-09-16 22:00:43

对于 linux来说,信号是软中断。许多重要的程序都需要处理信号。信号,为linux提供了一种处理异步事件的方法。比如,终端用户输入了ctrl+c来中断程序,会通过信号机制停止一个程序。

一、信号概述:
1、信号的名字和编号:
每个信号都有一个名字和编号,名字都以SIG开头。
信号定义在 signal.h,头文件中,信号名都定义为正整数。
信号是从1开始编号的,不存在0号信号。
使用kill -l来查看信号的名字以及序号。kill对0信号有特殊应用。
编号1-64:

 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

2、信号处理的方式:
(忽略,捕捉,默认动作)

忽略信号:
大多数信号可以使用这个方式来处理。但是 SIGKILL和SIGSTOP信号无法忽略。
捕捉信号:
需要高速内核,用户希望如何处理某一种信号,说白了就是写一个信号处理函数,然后将这个函数高速内核。当该信号产生时,由内核来调用用户自定义的函数,以此来实现某种信号的处理。
系统默认动作:
对于每个信号来说,系统对应默认的处理动作,当发生了该信号,系统会自动执行。

具体的信号默认动作可以使用man 7 signal 来查看系统的具体定义。
kill命令就是一个发送信号的工具
kill 9 PID:杀死进程
kill -SIGKILL PID:杀死进程
(使用ps指令来查看pid号:ps -aux|grep 运行的程序)

二、信号处理函数的注册
信号处理函数的注册不只是一种方法,分为入门版和高级版
1、入门版:函数signal
2、高级版:函数sigaction

#include <signal.h>
 
typedef void (*sighandler_t)(int);
 //指针返回void类型,参数为整型数,sighandler_t函数名
sighandler_t signal(int signum, sighandler_t handler);
//信号,指针,

三、信号处理函数的发送
信号处理函数的发送也不止一个,也分为入门版和高级版
1、入门版:kill
2、高级版:sigqueue

#include <sys/types.h>
#include <signal.h>
 
int kill(pid_t pid, int sig);

例:
实现信号,ctrl+c,关闭不了进程

#include <signal.h>
#include <stdio.h>
 
void handler(int signum)
{
	printf("get signal=%d\n",signum);
	switch(signum){
		case 2:
			printf("SIGINT\n");
			break;
		case 9:
			printf("SIGKILL");
			break;
		case 10:
			printf("SIGUSR1");
			break;
	}
	
	printf("never quit !\n");
}
 
int main()
{
	
	signal(SIGINT,handler);
	signal(SIGKILL,handler);
	signal(SIGUSR1,handler);
 
	while(1);
 
	return 0;
}

结果:

^Cget signal=2    //按CTRL+C得到
SIGINT
never quit !
^Cget signal=2
SIGINT
never quit !
get signum=10    //发送信号 kill -10 PID得到
SIGUSR1
never quit !
Killed           //发送信号 kill -9 PID得到

信号的发送程序:

//信号发送

#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
 
int main(int argc,char **argv)
{
	int signum;
	int pid;
 
	/*方法二*/
	/*char cmd[128] = {0};*/
	
	signum = atoi(argv[1]);
	pid = atoi(argv[2]);
 
	printf("num = %d,pid = %d\n",signum,pid);
 
//int kill(pid_t pid, int sig);

	kill(pid,signum);
	
	/*sprintf(cmd,"kill -%d %d",signum,pid);作出一个指令 kill -9 xxxx
	system("cmd");
	*/
	
	printf("send signal ok !\n");

	return 0;
}

如何忽略信号:
SIG_IGN
修改代码:
signal(SIGINT,handler);为signal(SIGINT,SIG_IGN);

更多推荐

混合应用比原生应用优越在哪里?

随着移动应用和桌面应用市场的不断发展,开发者们一直在寻找一种能够在多个平台上快速构建应用的方法。传统上,原生应用开发被视为性能最佳的选择,纯粹的原生应用通常是一种依赖于平台的GUI程序,它使用特定操作系统的本地开发语言和GUI框架。但近年来,跨平台混合应用的崭露头角,逐渐取代了性能优先的原生应用。本文将深入探讨这一趋势

安全线程的集合

1.CopyOnWriteArrayListpackagecom.kuang.unsafe;importjava.util.*;importjava.util.concurrent.CopyOnWriteArrayList;//java.util.ConcurrentModificationException并发修改异

Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析

文章目录1.BeanFactoryPostProcessor概览1.1解读BeanFactoryPostProcessor1.2.如何使用BeanFactoryPostProcessor2.BeanDefinitionRegistryPostProcessor深入探究2.1解读BeanDefinitionRegistr

云原生的简单理解

一、何谓云原生?一种构建和运行应用软件的方法应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。二、包括以下四个要素采用容器化部署:实现云平台的弹性基于微服务的架构:提高服务变更的灵活性和可维护性借助敏捷防范、DevOps支持持续迭代和运维自动化;1.1、微

QT中的inherits

目录简介:实例:简介:在Qt中,可以使用inherits函数来判断一个对象是否属于某个类或其派生类。inherits函数是QObject类的成员函数,因此只能用于继承自QObject的类的对象。以下是inherits函数的一般用法:boolQObject::inherits(constchar*classname)co

Long类型雪花算法ID返回前端后三位精度缺失问题解决

目录一、问题描述二、问题复现1.Maven依赖2.application.yml配置3.DemoController.java4.snowflakePage.html页面5.DemoControllerAdvice.java监听6.问题复现三、原因分析四、问题解决方案一方案二一、问题描述Java后端使用雪花算法生成Lo

【大数据实训】基于Hive的北京市天气系统分析报告(二)

博主介绍:✌全网粉丝6W+,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌🍅文末获取项目联系🍅目录1.引言1.1项目背景11.2项目意义12.需求分析22.1数据清洗需求分析22.2数据存储需求分析22.3MapRe

机器人还可以支持呼入?

呼入机器人是指一种能够接听电话并进行自动语音交互的人工智能软件系统。与传统的人工客服不同,呼入机器人可以根据预设的逻辑和语音识别技术进行自动回复和处理来电者的问题或需求,无需人工干预。这种软件通常能够帮助办公室工作人员更加高效地完成日常工作。通过使用呼入机器人,工作人员可以节省大量时间,并且能够更好地专注于高级工作。呼

Redis 缓存雪崩、缓存穿透、缓存击穿

Redis是一种常用的内存缓存工具,但在某些情况下,它可能会遭受缓存雪崩、缓存穿透和缓存击穿等问题。下面是一些预防这些问题的建议:1、缓存雪崩缓存雪崩指的是在某个时间点上,大量的缓存数据同时失效或过期,导致大量请求落到后端数据库上,引起系统崩溃。预防措施如下:逐级设置过期时间,避免所有缓存同时失效。设置随机过期时间,避

Vue实现大文件分片上传、断点续传

前言实现大文件分片上传的断点续传以及上传进度条是一个在前端开发中常见且具有挑战性的问题。本篇博客将介绍如何使用Vue框架来实现这个功能,并给出代码示例。概述大文件分片上传指的是将一个大文件切割成多个小文件(或称为分片),然后依次上传这些小文件,最后在服务器端将这些小文件合并为原始的大文件。断点续传则是在上传过程中遇到意

如何识别和解决PPPoE宽带连接的硬件故障

各位的爬虫大佬们!当你们在使用PPPoE连接时,偶尔会遇到硬件故障导致的连接问题。今天,我将为你提供一些有用的指导,帮助你识别和解决PPPoE连接中可能出现的硬件故障。第一步是确定故障的源头。以下是一些常见的硬件故障情况和对应的解决方法:1、网线故障有时候,连接问题可能由于网线出现故障而引起。首先,检查网线是否插好连接

热文推荐