Linux中的信号有哪些?
目录
1. 终止信号(Termination Signals)
2. 暂停/停止信号(Stop Signals)
3. 错误信号(Error Signals)
4. 核心转储信号(Core Dump Signals)
5. 进程控制信号(Process Control Signals)
6. 其他信号
信号的处理方式
在 Linux 系统中,信号是一种用于进程间通信的机制,可以向进程发送异步通知,以通知其发生某些事件。Linux 中的信号种类很多,常见的信号如下:
1. 终止信号(Termination Signals)
这些信号用于通知进程终止。
- SIGTERM (15):默认的终止信号,通常用于有序地终止进程。进程可以捕捉该信号,并在终止前执行一些清理工作。
- SIGKILL (9):强制终止进程的信号,进程无法捕捉或忽略它。这个信号会立即终止进程。
- SIGINT (2):通常由键盘产生的中断信号(如 Ctrl+C),用来终止前台进程。
- SIGHUP (1):挂起信号,通常表示终端挂断。许多守护进程会捕捉该信号并重新加载配置文件。
2. 暂停/停止信号(Stop Signals)
用于停止或暂停进程的执行。
- SIGSTOP (19):无条件地停止进程,无法被捕捉或忽略。
- SIGTSTP (20):通常由键盘(如 Ctrl+Z)发送的停止信号,进程可以捕捉并处理该信号。
- SIGCONT (18):继续执行被暂停的进程。可以用于恢复接收到
SIGSTOP
或SIGTSTP
的进程。
3. 错误信号(Error Signals)
这些信号通常由系统自动发送,用于报告程序出现的错误。
- SIGSEGV (11):段错误信号,当进程试图访问未分配的内存时产生。
- SIGFPE (8):浮点异常信号,如除零或其他算术错误时产生。
- SIGILL (4):非法指令信号,当进程执行了非法或无效的机器指令时产生。
- SIGBUS (7):总线错误信号,通常由于内存访问出错而产生。
4. 核心转储信号(Core Dump Signals)
这些信号会导致进程终止并生成内存转储(core dump),用于调试。
- SIGQUIT (3):来自键盘的退出信号(通常为 Ctrl+\),可以产生核心转储。
- SIGABRT (6):进程调用
abort()
函数时产生,用于异常终止并生成核心转储。
5. 进程控制信号(Process Control Signals)
这些信号用于控制进程的行为。
- SIGCHLD (17):当子进程状态发生变化(如退出或停止)时,父进程会收到此信号。
- SIGALRM (14):由计时器产生的信号,常用于定时任务。
- SIGUSR1 (10) 和 SIGUSR2 (12):用户自定义信号,用户可以在程序中定义这些信号的含义。
6. 其他信号
- SIGPIPE (13):当进程向一个没有读端的管道或 socket 写入数据时,产生该信号。
- SIGTTIN (21) 和 SIGTTOU (22):进程尝试从终端读取或写入数据,但该终端为后台进程时,会产生这些信号。
信号的处理方式
进程可以对信号进行以下处理:
- 忽略信号:通过调用
signal()
函数忽略特定信号,但某些信号如SIGKILL
和SIGSTOP
无法被忽略。 - 捕捉信号:进程可以通过设置信号处理函数(handler)来捕捉和处理特定信号。
- 默认处理:如果进程没有自定义处理方式,信号会按照系统的默认行为进行处理,例如终止进程。