在 Unix 和类 Unix 操作系统中,信号是一种异步的通知机制,用于通知进程发生了一些特定的事件。以下是一些常见的信号及其用途和默认行为的详细介绍:
常见信号及其用途
-
SIGINT
(2)- 含义:中断信号(Interrupt Signal)
- 来源 :通常由用户按下
Ctrl+C
产生。 - 默认行为:终止进程。
- 用途:用于请求进程立即中断当前操作。
-
SIGTERM
(15)- 含义:终止信号(Terminate Signal)
- 来源 :通常由
kill
命令发送。 - 默认行为:终止进程。
- 用途:用于请求进程优雅地终止,允许进程执行清理操作。
-
SIGKILL
(9)- 含义:强制终止信号(Kill Signal)
- 来源 :通常由
kill -9
命令发送。 - 默认行为:立即终止进程,不给进程任何机会执行清理操作。
- 用途:用于强制终止进程,通常在其他信号无效时使用。
-
SIGHUP
(1)- 含义:挂断信号(Hangup Signal)
- 来源:通常由终端会话结束或控制终端关闭产生。
- 默认行为:终止进程。
- 用途:用于通知进程其控制终端已关闭,常用于守护进程的重新加载配置文件。
-
SIGQUIT
(3)- 含义:退出信号(Quit Signal)
- 来源 :通常由用户按下
Ctrl+\
产生。 - 默认行为:终止进程并生成核心转储文件(core dump)。
- 用途:用于请求进程退出并生成调试信息。
-
SIGABRT
(6)- 含义:中止信号(Abort Signal)
- 来源 :通常由
abort()
函数调用产生。 - 默认行为:终止进程并生成核心转储文件。
- 用途:用于请求进程中止并生成调试信息。
-
SIGALRM
(14)- 含义:定时器信号(Alarm Signal)
- 来源 :通常由
alarm()
函数调用产生。 - 默认行为:终止进程。
- 用途:用于在指定时间后发送信号,常用于超时处理。
-
SIGSTOP
(17, 19, 23)- 含义:停止信号(Stop Signal)
- 来源 :通常由
Ctrl+Z
产生。 - 默认行为:暂停进程的执行。
- 用途:用于暂时停止进程的执行。
-
SIGCONT
(18, 20, 24)- 含义:继续信号(Continue Signal)
- 来源 :通常由
fg
或bg
命令产生。 - 默认行为 :恢复被
SIGSTOP
暂停的进程。 - 用途:用于恢复被暂停的进程。
-
SIGCHLD
(20, 17, 18)- 含义:子进程状态改变信号(Child Process Status Change Signal)
- 来源:当子进程终止或停止时产生。
- 默认行为:忽略。
- 用途:用于通知父进程其子进程的状态变化,常用于进程管理。
-
SIGUSR1
(30, 10, 16) 和SIGUSR2
(31, 12, 17)- 含义:用户定义信号 1 和 2
- 来源:由用户或程序自定义。
- 默认行为:终止进程。
- 用途:用于应用程序自定义的信号处理,通常用于触发特定的操作或状态变更。
-
SIGSEGV
(11)- 含义:段错误信号(Segmentation Fault Signal)
- 来源:当进程尝试访问无效的内存地址时产生。
- 默认行为:终止进程并生成核心转储文件。
- 用途:用于检测和调试内存访问错误。
-
SIGPIPE
(13)- 含义:管道破裂信号(Broken Pipe Signal)
- 来源:当进程试图写入一个已经关闭的管道时产生。
- 默认行为:终止进程。
- 用途:用于处理管道通信中的错误。
-
SIGFPE
(8)- 含义:浮点异常信号(Floating Point Exception Signal)
- 来源:当进程执行非法的算术运算(如除以零)时产生。
- 默认行为:终止进程并生成核心转储文件。
- 用途:用于检测和调试算术错误。
示例代码
以下是一个简单的 C 程序,展示了如何处理 SIGINT
和 SIGTERM
信号:
c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle_sigint(int sig) {
printf("Received SIGINT signal, cleaning up...\n");
cleanup();
exit(0);
}
void handle_sigterm(int sig) {
printf("Received SIGTERM signal, cleaning up...\n");
cleanup();
exit(0);
}
void cleanup() {
// 清理操作
printf("Performing cleanup...\n");
}
int main() {
// 注册信号处理器
signal(SIGINT, handle_sigint);
signal(SIGTERM, handle_sigterm);
// 模拟长时间运行的任务
while (1) {
sleep(1);
}
return 0;
}
总结
SIGINT
:中断信号,通常由Ctrl+C
产生。SIGTERM
:终止信号,用于优雅地终止进程。SIGKILL
:强制终止信号,立即终止进程。SIGHUP
:挂断信号,通常由终端会话结束产生。SIGQUIT
:退出信号,通常由Ctrl+\
产生。SIGABRT
:中止信号,通常由abort()
产生。SIGALRM
:定时器信号,用于超时处理。SIGSTOP
:停止信号,暂停进程。SIGCONT
:继续信号,恢复被暂停的进程。SIGCHLD
:子进程状态改变信号,用于进程管理。SIGUSR1
和SIGUSR2
:用户定义信号,用于自定义操作。SIGSEGV
:段错误信号,用于检测内存访问错误。SIGPIPE
:管道破裂信号,用于处理管道通信中的错误。SIGFPE
:浮点异常信号,用于检测算术错误。
通过理解和使用这些信号,你可以更好地控制和管理进程的行为,特别是在复杂的系统和分布式环境中。