2016-10-23 161 views

回答

1

您使用實時信號(SIGRTMIN+0SIGRTMAX-0),以便信號排隊,並且您很少有機會丟失信號。 (標準信號不排隊,所以如果兩個信號在幾乎相同的時間發送,實際上是隻交付其中的一個。)

當安裝使用sigaction()處理程序,您可以使用SA_SIGINFO標誌,這樣的簽名該處理程序是

void signal_handler(int signum, siginfo_t *info, void *context) 

當信號被使用sigqueue()發送,第三個參數是一個指針或int,存儲在union sigval類型的聯合。 (對於union sigval value,int是value.sival_int,且指針value.sival_ptr在Linux中,你可以發送一個完整longunsigned long使用value.sival_ptr = (void *)(unsigned long)yourval;。)

(在Linux中,sizeof (long) == sizeof (void *),這樣你就可以實際發送的信息CHAR_BIT*sizeof (long)位;這是在32位體系結構32和64在64位體系結構。)

,處理程序可確定是否信號被如果info->si_code == SI_QUEUE檢查使用sigqueue()發送。然後有效載荷 在info->si_value聯合。請注意,您無法知道發件人是發送了一個指針還是一個int,您需要事先知道。 sigaction()手冊頁描述了所有字段,包括si_code

不要混淆關於->si_int,->si_ptr->si_value。定義siginfo_t結構使得成員si_intsi_value.sival_int指代完全相同的int,並且si_ptrsi_value.sival_ptr指代完全相同的ptr。爲了向後兼容,這些字段還有一些額外的「名稱」,就這些。

請記住,在高負載時,即使實時信號也會丟失。但是,我們經常使用像HUPTERM這樣的信號來通知服務守護程序重新加載其配置或退出;所以,出於類似的管理目的,以及信息(而不是關鍵)消息,使用信號及其有效載荷是可以的。

0

信號不用於在進程之間傳遞過多的數據。考慮另一個IPC機制,如管道,插座等。

或者,您可以將它們結合使用。例如。在進程A之間共享管道的兩端,然後在進程A中寫入一些信息,然後發送信號給進程B.向進程B發送信號被視爲準備從管道讀取,然後進程B只是從一個管道讀取數據管道,由A寫入。

相關問題