Linux---进程信号的产生和处理

什么是信号


  1. 用户输入命令,在Shell下启动一个前台进程。
  2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。
  3. 如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执⾏行,CPU从用户态 切换到内
    核态处理硬件中断。
  4. 终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一 个SIGINT
    信号给该进程)。
  5. 当某个时刻要从内核返回到该进程的用户空间代码继续执行之前,首先处理PCB中记录的信号,发现有一个SIGINT信号待处理,而这个信号的默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码执行。

注意
1. Ctrl-C产生的信号只能发给前台进程。一个命令 后面加个&可以放到后台运行,这样Shell不必等待进
程结束就可以接受新的命令,启动新的进程。
2. Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像Ctrl-C这种控制键
产生的信号。
3. 前台进程在运行过程中用户随时可能按下Ctrl-C而产⽣生⼀个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到SIGINT信号而终止,所以信号相对于进程的控制流程来说是异步的。

使用kill -l命令可以查看系统定义的信号列表:
这里写图片描述
每个信号都有一个编号和一个宏名称,这些宏名称可以在signal.h中找到。

产生信号的常见方式:

  1. 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信 号,Ctrl-
    \产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号(可使前台进程停止)。
  2. 硬件异常产⽣生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。
  3. 一个进程调用kill(2)函数可以发送信号给另一个进程。
  4. 软件条件产生。

常见的信号处理方式:

  1. 忽略此信号。
  2. 执行该信号的默认处理动作。
  3. 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。

产生信号


1.通过终端按键产生信号

SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump。

  • Core Dump:当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。

2.调用系统函数向进程发信号

3.由软件条件产生信号

SIGPIPE是一种由软件条件产生的信号。

猜你喜欢

转载自blog.csdn.net/qq_37934101/article/details/80555222