"这篇文档主要介绍了Linux系统的信号机制,包括信号的概念、来源、种类以及一些常见信号的说明。"
在Linux系统中,信号是一种重要的进程间通信方式,它主要用于处理进程的异常情况或中断进程的正常执行。信号是异步的,即进程无法预知信号何时到达。例如,按下`Ctrl+C`会产生一个信号,通常会导致进程终止。信号的名字通常以SIG开头,如SIGABRT表示进程异常终止。
信号的来源主要有两个方面:一是硬件异常,如除数为零或非法内存访问,这些异常由硬件检测到并通知内核,内核随后向相应进程发送信号;二是软件触发,通过函数如`kill`, `raise`, `alarm`, `setitimer`或`sigqueue`来发送信号。
早期的Linux信号机制存在一些问题,如信号处理后处理函数会恢复到默认值,可能导致信号丢失,并且不支持信号排队。这被称为不可靠信号,主要包括信号值小于SIGRTMIN的信号(1~31)。然而,现代Linux对此进行了改进,现在信号处理函数可以保持用户设定的状态,减少了信号丢失的可能性。
Linux系统定义了64种信号,分为两类:非实时信号(前32种)和实时信号(后32种)。非实时信号大多是不可靠信号,不支持排队,而实时信号则是可靠信号,它们支持信号排队,即使信号被多次发送,处理函数也会相应地被调用多次。
文档还列举了一些常见的Linux信号及其默认处理方式:
- SIGABRT:由`abort`函数调用产生,导致进程异常结束并产生核心转储文件。
- SIGALRM:当定时器到期(如`alarm`或`setitimer`设置的)时发送,进程将被终止。
- SIGBUS:指示总线错误,如地址对齐问题,处理方式取决于具体的硬件,通常会导致进程结束并产生核心转储文件。
- SIGCHLD:当子进程停止或终止时,其父进程会收到这个信号。默认情况下,这个信号会被忽略。
信号屏蔽字是每个进程都有的一个标志,它定义了当前进程中哪些信号可以被递送,哪些需要被阻塞。在执行敏感任务时,进程可以阻塞信号,防止外部干扰,待任务完成后,再处理这些被阻塞的信号。在信号处理函数执行过程中,当前信号会被自动加入到信号屏蔽字中,以防止在处理过程中再次被同一信号中断。