信号分为两大类:
- 标准信号,用于内核向进程通知事件,信号范围为1~31
- 实时信号
信号产生后,会在稍后被传递给某进程,进程也会采取某措施来响应信号。在产生和到达期间,信号处于pending(等待)状态。
有时需要确保一段代码不被传递来的信号所中断,这时可以把信号添加到进程的信号掩码中,阻塞该组信号的到达。如果所产生的信号属于阻塞之列,那么信号将保持pending状态,直到后面对其解除阻塞(从信号掩码中移除)。进程可使用各种系统调用对其信号掩码添加和移除信号。
根据信号的不同,进程可以对信号执行的默认操作:
- 忽略信号:内核将信号丢弃,信号对进程没有产生任何影响(进程都不知道曾出现过该信号)
- 终止进程:进程异常终止,不是因调用exit()而发生的正常终止
- 产生coredump文件,同时终止进程
- 暂停进程
- 恢复进程:暂停之后恢复执行
除了采取默认行为之外,进程也能改变信号的响应行为,将此称为对信号的disposition(处置),程序可以将对信号的disposition设置为:
- 采取默认行为
- 忽略信号:适用于默认行为为终止进程的信号
- 执行信号处理器程序:用户自定义
通知内核应当去调用某处理器程序的行为,通常称之为安装信号处理器程序,调用信号处理器程序以响应传递来的信号,称之为信号已处理或已捕获
无法将信号disposition设置为终止进程或者coredump(除非是默认行为),效果最为近似的是为信号安装一个处理器程序,并于其中调用exit()或者abort()。abort()函数为进程产生一个SIGABRT信号,该信号将引发进程coredump并终止
常见的信号值及其默认行为
信号名 | 信号值 | 描述 | 默认行为 |
---|---|---|---|
SIGINT | 2 | 终端中断 | term |
SIGABRT | 6 | 终止进程 | core |
SIGKILL | 9 | 必杀 | term |
SIGTERM | 15 | 终止进程 | term |
SIGSTOP | 19 | 必停 | stop |
kill -6
让进程core,会产生coredump文件,一般用于杀死正常执行的程序kill -9
直接杀死进程,一般用于杀死僵尸进程Ctrl+C
产生SIGINT
信号