目录
1.什么是信号?
Linux信号机制是进程间通信的一种方式,用于在不同进程之间传递信息。它通过向目标进程发送一个特定的信号,来触发目标进程执行相应的处理操作。
Linux内核中实现信号机制的关键是信号处理函数和信号传递,每个进程都有一个信号表来表示该进程对不同信号的处理情况。
当一个进程向另一个进程发送信号时,内核会将信号添加到目标进程的信号队列中。
2.信号实现原理
3.信号生命周期
Linux信号生命周期是指信号的产生、传递、处理和终止的整个过程。
-
信号产生
信号的产生可以由多种事件触发,例如硬件中断、软件异常或用户自定义信号。当一个事件发生时,内核会为每个进程确定一个目标信号,并将其发送给相应的进程。
-
信号传递
信号传递是指信号从一个进程传递到另一个进程或同一进程中的不同线程。在传递过程中,信号可以被阻塞或者被忽略,也可以通过信号处理函数进行处理。
-
信号处理
信号处理是指接收到信号后进程对信号的响应行为。进程可以选择默认的处理方式,比如终止进程或忽略信号,也可以自定义信号处理函数来处理特定的信号。
-
信号终止
信号的终止是指信号处理完成后,进程或线程恢复到正常执行状态。如果进程选择了默认的处理方式,可能会导致进程异常终止;如果进程选择了自定义的信号处理函数,并在处理函数中返回,则进程将继续执行原来的代码。
4.信号分类
Linux一共由64种信号,每一个信号都有唯一整数编号,Linux信号可以分为不可靠信号和可靠信号。
-
不可靠信号
不可靠信号又称非实时信号,是指在信号传递过程中可能丢失或产生不可预测行为的信号,这意味着当一个进程接收到该信号时,无法确保该信号一定会被进程处理。1-31号信号为不可靠信号。
-
可靠信号
可靠信号又称实时信号,是保证传递和处理的信号。当一个进程接收到可靠信号时,系统会确保该信号不会丢失,并且会等待进程处理完该信号后再继续执行其他操作,Linux使用队列来保存待处理的信号,保证它们按照接收的顺序被进程处理。34-64号信号为可靠信号。
执行kill -l命令查看所有的信号。
5.信号常见概念
-
信号递达
执行信号的处理动作称为信号递达(Delivery)。
-
信号未决
信号从产生到递达之间的状态,称为信号未决(Pending)。
-
信号阻塞
信号阻塞又称信号屏蔽,进程可以选择阻塞(Block)某个信号,被阻塞的信号产生时将保持在未决状态。
6.信号阻塞和信号忽略的区别?
-
信号阻塞是信号的一种状态,信号忽略是一种信号处理方式。
-
被阻塞的信号将处于未决状态,直到阻塞被解除。
-
信号忽略说明信号已经按照忽略方式处理。