答案 0 :(得分:6)
关于信号的传递,TLPI指出当下一次调度任务时,从内核模式切换到用户模式时“正常”传递信号,或者当任务已经运行时“立即”传递信号(可能“立即”将具有通过首先触发中断来发生,否则它怎么能这样做)。好吧,无论这意味着什么,它都不是严格约束,但它与发生的事情非常接近。
您必须区分实时和“正常”信号以及同步生成的“正常”信号之间,大部分时间是由于硬件事件(例如分段故障)而不是(它们是)不经意地重新生成。)
实时信号排队,正常信号不。这意味着正常信号的实现很可能仅仅类似于一个用作位掩码的每个任务字 生成“正常”信号意味着设置一个位,当操作系统下一步决定是否必须传送信号时,它会测试该字对零,并在必要时确定设置了哪个位,并调用信号处理程序(s),如果有的话,相应的 人们需要知道这一点的唯一实际原因是因为它可能“丢失”信号。如果在第一次发送之前生成了两个或多个信号,那么它仍然只有一个信号。
实时信号的实现(排队到依赖于实现的长度所需)显然要复杂得多。
由于硬件事件(例如段错误)而发生的信号是同步生成的,其方式与在其自身上调用kill
的过程(第22.4章TLPI)相同,即它们是“立即”传递的,两个原因。首先,做其他事情是没有意义的,第二,当陷阱处理程序返回时,已经发生了内核/用户切换。因此,无论如何,交付总是“立即”。
答案 1 :(得分:0)
基本上,信号是异步的。它们依靠信号处理程序在收到信号时执行代码,因为您永远不知道何时由于进程调度程序等因素。发送信号的延迟基于硬件/软件中断,该中断基于时钟速度。
如果您想知道在Linux上如何实现某些功能,请查看POSIX标准。
有关信号的重要信息:
http://www.gnu.org/software/libc/manual/html_node/index.html#toc_Signal-Handling
生成信号时,它变为待处理。通常它仍然存在 等待很短的时间,然后交付到 发出信号的过程。但是,如果是那种信号 目前已阻止,它可能会无限期地保持待定状态 - 直到信号发出 那种解锁。一旦解锁,它将被交付 立即
另一段摘录:
当信号传递时,无论是马上还是很久之后 延迟,该信号的指定动作。