Linux下常用信号有哪些,kill命令,pkill,core文件(信号)【linux】(zq)

Linux下常用信号有哪些

可以通过kill -l 命令显示信号列表:
在这里插入图片描述

  1. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  2. SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  3. SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46)SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50)SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-1154)SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  4. SIGRTMAX-1 64) SIGRTMAX

总共62个信号,也就是说每个进程可以接收的信号种类有62种,1~64为信号的编号,SIG***为信号的宏名。

为什么这么多信号?

每个信号代表着某种事件,一般情况下,当进程收到某个信号时,就表示该信号所代表的事件发生了。
可能发生的事件会有很多种,所以有这么多的信号,每个信号对应着自己特有的事件。

这么多信号,我记不住怎么办?
(1)35~64:这些信号是Linux后期增设的信号,这些个信号不需要关心,所以不用了解。
(2)1~34:也不是所有的信号都要掌握,我们只关心其中常用的信号
(3)就算对1~34中的于常用信号,我们的要求是理解,而不是记忆,因为我也记不住,当你忘记了信号名字时,kill -l查看即可总之对于这些个信号,理解才是关键。

常用信号及详细说明

在这里插入图片描述

前面的图片很模糊,这里进行详细说明:
SIGABRT 6 终止进程,调abort函数是产生 终止,产生core文件 会给调用abort的函数发送信号,进程在收到信号之后收到信号的进程就会终止。

SIGALRM 14 超时,调用alarm函数时产生 终止 设置一个闹钟,当时时间到了之后就会向调用alarm的函数发送一个信号,收到这个信号的进程就会被终止。

SIGBUS 7 硬件故障 终止,产生core文件 因为操作硬件故障而收到的信号

SIGCHLD 17 子进程状态改变 忽略 子进程终止之后返回到内核,内核就会给父进程发送 SIGCHLD 信号,告诉父进程它的子进程终止了,进程的任何两个状态状态改变在切换的过程都会发送SIGCHLD 反送给父进程。

SIGINT2 终止进程(ctrl+c) 终止 终端程序忽略(ctrl+c),只会终止占用命令行终端的进程

SIGIO29 异步通知信号 终止 高级IO博客进行说明

SIGKILL9 无条件终止一个进程,不可以被捕获或忽略 终止 如果这个信号被忽略那就麻烦了,那就没有信号可以杀死进程,那么就会一直运行下去,除非重启操作系统,终极终止信号

SIGPIPE13 写没有读权限的管道文件时 终止 IPC管道通信进行说明

SIGPOLL8 轮询事件,涉及POLL机制 终止 高级IO中POLL进行说明

SIGTERM 15 kill PID是默认发送的信号 终止 默认发送终止信号,进程才能被终止

SIGQUIT 3 终止进程(ctrl+\) 终止,产生core文件

SIGSEGV11 无效存储访问(指针错误) 终止,产生core文件 操作错误指针或者错误地址,进程被终止

SIGUSR1 10 用户自定义信号1 终止

SIGUSR2 12 用户自定义信号2 终止

为什么当进程收到某些信号时,会被终止呢?

1)比如ctrl+c发送SIGINT给进程时
2)比如操作一个错误地址,内核发送SIGSEGV信号给进程时
3)比如ctrl+\发送SIGQUIT信号给进程时
4)比如在命令行使用kill pid,默认发送SIGTERM信号给进程时

因为你发送的这些信号的处理方式是终止,所以进程会被终止掉。

kill命令

kill的作用

(a)kill -l:查询信号列表
(b)通过PID向进程发送一个信号

kill只是发送信号,至于进程会不会被终止,这就看信号的处理方式,处理方式如果是终止,那么就会终止进程。所以进程是否会被信号终止,是由信号的处理方式来决定的,而不是kill命令,当初起名字的时候,如果把kill起名为send估计更好理解些,因为kill所起到的作用只是发送信号。

发送信号的完整格式:kill -信号编号 PID

如果不写明信号编号的话:kill PID,默认发送的是15(SIGTERM)信号,等价于kill -SIGTERM PID或者kill -15 PID只有发送15这个信号时才能省略信号编号,发送其它信号时必须写明信号编号。

为什么kill发送15(SIGTERM)这个信号时,信号编号可以省略?

我们说每个信号都有自己的特有用途,当初定义15(SIGTERM)信号的目的,就是专门给我们从命令行终端窗口,发送该信号去终止某个进程用的,也就是说如果你想在命令行使用kill命令去中断某个进程时,专用信号就是15。其实一般只要默认处理方式是终止的信号,我们都可以使用Kill命令将其发送给某个进程,这些信号都可以将进程终止掉,但是既然每个信号有自己的专门用途,那么在命令行去终止某个进程时,我们最好是使用专门的SIGTERM信号,这样显得更专业些。

为了方便我们使用,Linux允许发送15这个信号时,不用设置信号编号,kill pid时会帮你默认发送这个信号。

pkill

kill命令的兄弟,用法与kill差不多,只不过kill是按照PID来识别进程的,pkill是按照名字来识别进程的。Pkill -信号编号 名字:

pkill -SIGINT  a.out
同样的,如果不写明信号编号的话,默认发送的是15(SIGTERM)这个信号。

信号的发送与接收

发送

一般来说,大多数发送信号的原因,都是因为内核、硬件发生了某些事件时,才会向某个进程发送该事件专用的信号,告诉该进程这个事件发生了。不过对于我们自己写的进程来说,其实更多是接收信号,而不是发送信号。

我们自己发送信号的原因无非如下几种情况:
(a)ctrl+C、ctrl+\发送信号,终止正在运行进程

(b)命令行执行kill命令发送信号,终止跑飞的进程,通常都是发送15这个信号15这个信号的名字叫SIGTERM,TERM就是terminal的缩写,其实就是命令行终端的意思。
当无法使用ctrl+c、ctrl+\来终止进程时,往往就使用kill命令来终止进程。

那么什么样的进程会使用crtl+c、ctrl+\来终止?
只有当进程有占用命令行终端时,才能crtl+c、ctrl+\来终止。

(c)因为某些特殊需求,往往在我们自己的程序里面,需要调用kill函数向另一个进程发送某个信号。

比如A进程和B进程需要协同工作,A进程将相应事件准备好以后,可能需要发送一个信号给B进程,通知B进程,B进程收到信号后,就知道该事件已经准备好,可以配合A进程做事了。

至于说自己写的进程发送什么信号合适呢?

其实发送哪一种信号都行,但是我们说几乎每一种信号都有自己特定的用途。
所以我们自己的程序在发送信号时,如果发送别人专用事件的信号的话,这样显得很不正规,而且很可能造成误会,比如我的A进程给另一个进程发送了一个SIGSEGV信号,B进程还以为发生了指针错误事件,其实发生并不是指针错误事件,而是其它事件,这就造成了理解的错误。因此自己进程调用kill函数发送信号时,我们可以发送的是SIGUSR1、SIGUSR2这两个自定义信号,所谓自定义就是,信号所代表的事件,可以由程序员自己根据实际情况来规定。

接收

对于我们自己写的进程来说,最常见信号操作的还是接收信号,不过在一般情况下,我们进程并不会去重新设置信号的处理方式,而是使用信号的默认处理方式来处理信号。

虽然很少重新设置信号的处理方式,但是总还是有这种需求的,所以博客我们后面会介绍,如何调用API来重新设置信号的处理方式。

core文件

用于保存程序(进程)在当前结束的这一刻,进程在内存中的代码和数据,core文件可以用于分析进程在结束时的状况,不过由于进程代码和数据都是二进制的,所以把core文件直接打开后我们是看不懂的,一般需要特殊软件翻译后才能看懂。

并不是所有的信号在终止进程时都会产生core文件
只有某些信号在终止进程时才会产生core文件,不过一般情况下并不会创建这个文件,因为系统默认将产生core的设置给关闭了,只有打开后这个设置后才会保存core文件。

所以当你看到提示core dumped,这就表示这个信号终止进程时,会产生core文件,只不过由于关闭了设置,因此core文件被丢弃了,dumped就是丢弃的意思。

例子1:crtl+\ 发送SIGQUIT信号
例子2:操作错误地址

我们在前面已经遇到过这种情况,这里就不再演示进行说明。

如果你不想丢弃core文件怎么办?
对相关的系统文件进行设置就可以了,core文件一般默认保存在当前路径下。由于core在实际开发中基本用不到(除非某些很特殊的场合),所以我们这里不再深入介绍core文件。

发布了163 篇原创文章 · 获赞 94 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104603817
今日推荐