一、认识信号
信号是一种通知机制。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
使用命令
kill -l 查看系统的信号列表
每个信号都有一个编号和一个宏定义名称,这些宏定义可以在 signal.h 中找到例如:
#define SIGINT 2
编号34以上的是实时信号,本文讨论编号34以下的信号。
二、产生信号
1.通过按键产生信号
SIGINT(Ctrl+C 组合键)的默认处理动作是终止进程
SIGQUIT(Ctrl+\ 组合键)的默认处理动作是终止进程并且Core Dump
例如,使用Ctrl+C组合键可以生成SIGINT信号,在计时器过期之前按Ctrl+C组合键,可以使sleep命令提前终止;
Ctrl+Z组合键生成SIGSTP信号,可以停止任何在shell中运行的进程。
停止进程与终止进程不同,停止进程后程序任然留在内存中,能够从停止的地方继续运行。
2.调用系统函数向进程发信号
写一个死循环程序并运行
用kill命令给它发SIGSEGV信号:
以往遇到的段错误都是由非法内存访问产生的,而这个程序本身没错,给它发SIGSEGV也能产生段错误
kill命令是调用kill函数实现的。kill函数可以给一个指定的进程发送指定的信号。
raise函数可以给当前进程发送指定的信号(自己给自己发信号)
#include <signal.h>
int kill(pid_t pid, int signo);