[信号]

信号基础:

有助于理解:

1.为什么ctrl+c可以结束进程

2.产生指针错误的时候为什么进程会自动结束,并产生'segment fault'段错误

3.kill的原理

4.c.c++.JAVA线程库都有信号的概念,QT的信号槽的理解

信号概念:

信号是一种向进程发送通知,并告诉其某件事情发生了的一种简单通信机制

谁会发送信号

[信号]

进程、硬件(先发给内核)、内核

1.进程

2.内核发送信号

操作一个地址,地址只允许读,但是不允许写,写操作就会失败,内核就会向当前进程发送一个信号(SIGSEGV)

3.底层硬件发送信号

底层硬件发生了某个事件,会向进程发送对应的信号

比如ctrl+c :会向相应的进程发送SIGINT信号,将其异常终止

不管信号是被哪个进程终止的,被信号终止的,都是异常终止

进程收到信号后,会如何处理

忽略、捕获、确认

如果不忽略也不捕获的话,信号就会使用系统默认的方式去处理

都有哪些信号

[信号]

共62种信号,1-64为信号的编号,SIG****为信号的宏名

[信号]

[信号]

为什么会有这么多的信号

每个信号代表某个事件,一般情况下,当进程收到某个信号的时候,就代表该信号代表的事件发生了

可能发生的事件有很多种,所以弄出了这么多的信号,每个信号对应着特定的事件

kill和pkill命令

(1)为什么当进程收到某些信号的时候,会被终止

比如ctrl+c、操作一个错误地址SIGSEV给进程、ctrl+\发送SIGOUT给进程、kill pid发送SIGTERM信号给进程

因为发送信号的处理方式是终止,所以会被终止掉

(2)kill

        (a)kill的作用,kill -l查询信号列表

        (b)通过PID(进程ID)向进程发送一个信号

kill起到的作用只是发送信号,至于信号起到什么作用,要看信号的处理方式,如果信号的处理方式是终止,那么就会终止进程

kill的格式:kill     -信号编号      PID

不写信号的话,默认发送的是15号信号,等价于kill -SIGTERM  PID  或 kill  -15 PID

(3)pkill

kill作用一样,只不过kill是按照PID来识别进程,而pkill按照名字来识别进程

pkill   -SIGINT   a.out

信号的接收与发送