在Linux中,当一些相关事件发生时,会生成许多信号。
信号和事件之间的关联是如何创建、删除、修改、启用和禁用的? (最好是API方面)
有内核使用的信号和用户定义的信号,它们的处理方式是否不同?
答案1
“可靠”和“实时”信号生成、传递和默认处理都是由 POSIX 指定。该规范定义了哪些事件生成哪些信号。 Linux添加一些信号对应于其他 Unix 系统的传统信号。如果您想要添加、删除或修改事件和信号之间的关联,则必须在操作系统中实现它,然后向 Austin Group(编写 POSIX 的地方)提出您的案例。
可用于控制信号生成、传输和处理的 API 非常广泛,请参阅上面的链接了解详细信息。其中一些控制如何处理信号(默认操作、忽略或特定处理程序),但无法控制事件和信号本身之间的关联。因此,浮点异常总是会导致SIGFPE
,这可以通过不同的方式处理;在其他情况下,进程SIGFPE
也可以手动发出问题,但浮点异常与SIGFPE
无法禁用之间的连接。
一些可靠的信号是为用户定义的目的而设计的,SIGUSR1
并且SIGUSR2
。没有与这些信号对应的预先建立的事件,但是有预先建立的动作(终止接收进程)。由生成过程来确定哪些事件导致生成这些信号之一;没有办法告诉内核在某些情况下自动生成这样的信号。 (BPF 程序可以发送信号,因此信号生成代码可以托管在内核中,但这并不完全相同。)
实时信号都是用户定义的。与用户定义的可靠信号一样,它们默认终止接收过程。
你的第二个问题已经在是什么原因导致发送各种信号?