信号的基本概念
为了理解信号,举一个我们熟悉的例子
用户输入命令,在shell下启动一个前台进程
用户按下CTRL-C,这个键盘输入产生一个硬件终端
如果CPU当前正在执行这个进程的代码,则该进程的用户空间代码暂停执行,CPU从用户态切换到内核态处理硬件中断
终端驱动程序将CTRL-C解释成一个SIGINT信号,记在该进程的PCB中,当某个时刻要从内核返回到该进程的用户空间代码继续执行之前,首先处理PCB中记录的信号,发现有一个SIGINT信号待处理。而这个信号的默认处理动作是终止进程,所以直接终止进程而不再返回它的用户空间代码执行
其中Ctrl-C产生的信号只能发给前台进程
shell可以同时运行一个前台进程和任意多个后台进程
信号相对于进程的控制流程来说是异步的
用Kill-l就可以查看系统定义的信号列表
产生信号的三种方式
1:通过终端按键产生信号
SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,ulimit 命令改变了shell进程的Resource Limit,当Core Dump的时候我们就可以使用core文件了
我们用gdb-file core.core文件名,就可以直接调试出错误出现在哪里
2:调用系统函数向进程发信号
kill命令是调用kill函数实现的,kill函数可以给一个指定的进程发送指定的信号。raise函数可以给当前程序发送指定的信号
#include<signal.h>
int kill(pid_t pid,int signo);
int raise(