2009-12-18 46 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將允許一次讀取多個信號實例,如果它們排隊。