2009-12-18 47 views
6

我需要查找linux中线程的信号队列中未决信号的数量。是否有任何由Linux提供的API?如何确定unix信号队列中待处理的信号的数量(Linux)

此API需要从线程调用,而不是我们正在查询的线程。

sigpending给出调用线程的API。是否有任何API,它将线程ID设置为arg,并提供有关队列中未决信号的一些信息。

任何帮助表示赞赏。

回答

3

我不知道这样的API,但这里有一个解决方法:编写一个封装信号代码的小型库。发送信号时,增加一个原子计数器。在处理信号时,再次递减计数器。然后,你可以使用这个原子计数器来回答你的好奇心。

如果这还不够,那么你有源代码:只需检查代码和数据结构,并使用你需要的内核来查看内核结构。但是这可能涉及编写一个模块(因为内核的数据结构不能被进程读取),而且你的代码将依赖于编译它的内核。所以我建议不要这种方法。

+2

这是我所见过的最能找到待处理(不可用)的RT信号。其他的内核无论如何都是由内核组合(按类型),这可能值得注意。 10,000 SIGUSR1的交付时间为1。 – 2009-12-19 12:38:30

6

sigpending()返回待处理线程的一组信号。您可以迭代sigset_t并使用sigismember()来测试成员资格。

传统上,UNIX不排队多个信号实例(从这个意义上说,它们仍然是“不可靠的”)。有时你可以通过实时信号获得这种效果。

在Linux上,从signalfd读取()ing将允许一次读取多个信号实例,如果它们排队。