【Linux】信号简介与触发信号的几种方式

相信大家或多或少都听说过信号这一概念,这篇博客将为大家讲解一些信号方面的基础知识

信号简介

定义 Linux操作系统中重要的消息机制
功能 主要被用于进程干预处置,大多数信号的作用是杀死或挂起进程,只有少部分的信号不是用来杀死或挂起进程
个数 64个,可通过命令 kill -l 来查看系统支持的信号

这个时候有些同学可能就会有下面这些疑惑

  1. 要是信号只是用来杀进程的话,只设计一个信号直接干掉进程不就得了嘛?
  2. 为什么这么多信号,还大多数信号都是用来干掉或挂起进程的?

这里我们来做一个情景假设,相信大家很容易就明白了

比如你自信满满的写了段代码,一编译运行,操作系统把对应的这个进程干掉了,你再编译运行,又给你干掉了,然后啥错误都不给你返回,你人傻了,我靠,我这代码这么惊天地泣鬼神,就算有那么一丢丢的小瑕疵,你好歹让我知道错哪了吧

此时,信号就起到了这个作用,当进程出现错误时,就会触发对应的信号,操作系统接收到信号时,就会去杀死该进程,同时根据接收到的信号为你返回错误原因

总而言之,信号就类似于罪名   进程犯了什么错,就会为你返回对应的罪名

关于信号的一些小秘密

在前面的内容中,我们说过,可以通过命令 kill -l 来查看系统支持的信号

【Linux】信号简介与触发信号的几种方式_第1张图片

在这个图片中,我们可以发现两个有趣的地方

  1. 信号31和信号34之间空缺了两个信号,这是为什么呢?
  2. 为什么信号1-31和信号34-64的格式不一致呢?

解答1:32号信号和33号信号是隐藏信号,被保留给NPTL线程库使用,用户无法使用

解答2:首先我们要知道,开发分为软件开发与硬件开发。1-31号信号是Unix经典信号,供软件开发使用。34-64号信号被称之为自定义信号,也被称为实时信号,是供驱动层开发使用

系统中触发信号的几种方式

1.终端组合按键触发信号

相信大家或多或少地都在终端中用过CTRL+C来杀死进程,其实它的实现原理就是:当你按下该组合按键时,就会向目标进程发送2号信号—SIGINT,然后操作系统杀死该进程

CTRL+\ 也是同理,触发的是3号信号—SIGQUIT,作用同样是杀死进程,会显示“退出(核心已转储)”字样

CTRL+Z,触发的是20号信号—SIGTSTP来挂起终端进程到后台

PS:19号信号—SIGSTOP和20号信号—SIGTSTP的作用都是挂起进程,二者不同的地方就在于20号信号—SIGTSTP中的第一个T,这个T是TTY的意思,由于TTY的解释过于占用篇幅,我在这里就不做过多介绍,大家只需要知道TTY和终端有关,感兴趣的同学可以去了解一下

所以20号信号—SIGTSTP的作用就是——由终端发送TSTP信号来挂起终端进程

19号信号—SIGSTOP的作用就是——由操作系统发送STOP信号来挂起目标进程

2.命令触发信号

这个大家也很常用,kill  -signo  pid  #向任意目标进程发送任意信号

signo——信号编号

3.函数触发信号

有三个比较常用的函数,如下所示:

  1. kill(int pid , int signo) #向任意进程发送任意信号
  2. raise(int signo) #向自身进程发送任意信号
  3. abort(void) #向自身进程发送6号信号——SIGABRT

     PS: kill命令就是用kill函数写的,不要直接看下面的代码,大家可以尝试一下自己实现

#include
#include
#include
#include

int main(int argc , char** argv)
{
	if(argc < 3)
	{
		printf("参数输入过少,请检查!\n");
		exit(0);
	}
	kill(atoi(argv[2]) , atoi(argv[1]));
	printf("进程已杀死!\n");
	exit(0);
}

【Linux】信号简介与触发信号的几种方式_第2张图片

4.硬件异常产生信号

常见的有以下三种情况:

  1. 段错误,进程非法访问内存,就比如只读的内存你写了,系统就会通过11号信号—SIGSEGV杀死进程
  2. 总线错误,内存访问越界,比如栈溢出问题,系统就会通过8号信号—SIGBUS杀死进程
  3. 浮点数例外,CPU违规运算,运算异常,系统就会通过7号信号—SIGFPE杀死进程

但要注意的是,无论进程是否异常,只要接收到杀死信号就会被杀死

5.软条件触发产生信号

常见的有以下两种情况:

  1. 管道读端关闭,写端写管道,系统向写端发送SIGPIPE信号,杀死写进程
  2. unsigned int alarm(unsigned int seconds) , 定时到时后出发SIGALRM信号给定时进程,然后杀死该进程

以上就是本篇博客的全部内容了,大家有什么地方没有看懂的话,可以在评论区留言给我,咱要力所能及的话就帮大家解答解答

今天的学习记录到此结束啦,咱们下篇文章见,ByeBye!

你可能感兴趣的:(Linux,linux,学习)