嗨,有没有人知道一种方法发送信号SIGUSR1 / 2而不会损失到另一个pid?
问题是当我把kill(pid,SIGUSR1)放在while循环中时,我的其他程序只收到其中的几个,它似乎有一个损失,我必须等待两次调用kill()。 我实际上被迫在我的循环中使用usleep()以接收我发送的所有SIGUSR信号。 我希望尽可能快地收到所有这些内容。
THX。
答案 0 :(得分:2)
您需要使用sigaction()
而不是signal()
,因为sigaction()
可以控制在处理当前信号时阻止哪些信号。此外,您的接收器必须处理收到的每个信号;与发送信号相比,这是相对昂贵的,因此您的杀手(信令)过程可以轻松超越“被杀”(接收)过程。您应该考虑为什么需要发送这么多信号。它们是在特殊情况下使用的机制。
答案 1 :(得分:1)
无法保证提供完全相同数量的信号。如果您发送两个或更多SIGUSR1而其他进程被阻止且无法处理其中的第一个,或处理此信号的先前实例,或者此信号被阻止,则除了一个信号之外的所有信号都会丢失:内核中有待处理信号的位掩码,不是计数器数组。
你只能希望尽可能多地收到它们。
答案 2 :(得分:0)
有所谓的实时信号。它们有一个队列,除非你溢出队列,否则你可以保证每个发送的信号都收到一个信号。这些是34-64范围内的信号或可移植的信号,SIGRTMIN - SIGRTMAX。
但是,如果您的任务是使用SIGUSR1和SIGUSR2,那么您可能应该了解不可靠的数据传输。电路中也会出现同样的问题。如果已经通过电信号设置了锁存器,则在读取和清除锁存器之前,第二信号无效。这就是串行和并行端口具有时钟和/或确认信号的原因。