簡體   English   中英

父母和孩子的不同的信號處理程序

[英]Different signal handlers for parent and child

我有一個帶有信號處理程序的程序:

signal(SIGINT, signalhandler);

然后程序分叉和子代需要一個不同的信號處理程序,所以:

pid = fork();

/* What happens here? */

if(pid==0)
{
signal(SIGINT, signalhandler_for_child);
}

那么如果在fork之后但在分配新的簽名處理程序之前調用SIGINT會發生什么?

這可能發生,或者在孩子獲得新的信號處理程序之前不可能被中斷。

如果可能的話。 我如何將信號排隊給孩子,以便有時間獲得新的處理程序?

我知道概率(如果存在的話)必須幾乎為0,但我想確保應用程序在這方面是健壯的。

那么如果在fork之后但在分配新的簽名處理程序之前調用SIGINT會發生什么?

將調用父項中安裝的信號處理程序。 子進程繼承它。

這可能發生,或者在孩子獲得新的信號處理程序之前不可能被中斷。

可能會發生。

如果可能的話。 我如何將信號排隊給孩子,以便有時間獲得新的處理程序?

要確保,您需要調用fork() 之前阻止SIGINT,然后在子進程中重新安裝另一個SIGINT,然后取消阻止SGINT。

/* block SIGINT here. */

pid = fork();

if (pid == 0) {
    /* Install a new SIGINT handler here. */
    /* Unblock SIGINT. */
    ...
} else if (pid > 0) {
   /* The SIGINT handler is already in place. So just unblock SIGINT. */
   ...
} else {
   /* error */
}

查看sigprocmask()pthread_sigmask()以阻止和解除阻塞信號。

您還可以找到有關信號阻塞GNU文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM