2010-01-27 67 views
1

我也做了以下內容:Linux虛擬定時器行爲

  1. 創建反覆觸發虛擬計時器。
  2. 安裝信號處理程序SIGVTALRM
  3. 調用clone系統調用
  4. 集sched_affinity使得克隆的線程不同的CPU

將克隆的線程也可以監聽SIGVTALRM上運行?那麼當SIGVTALRM被觸發時,兩個線程都會調用信號處理程序嗎?另外,在創建新線程之後,我是否可以將SIGVTALRM的signalhandler更改爲另一個函數,而不會影響主線程signalhandler?

我猜這取決於傳遞給克隆標誌()。主要是,我正在使用CLONE_SIGHAND和SIGCHLD。它也取決於其他標誌嗎?

+0

它也取決於'CLONE_THREAD'標誌。 – caf 2010-01-27 23:42:01

回答

1

這完全取決於你是否指定CLONE_THREAD到克隆系統調用。如果你做而不是,那麼itimer不會被孩子繼承(所以它不會在計時器到期時發信號通知)。它仍然會安裝信號處理程序。

如果你指定CLONE_THREAD,那麼這個孩子被認爲屬於與父母相同的過程。當計時器到期時,一個的線程將被髮信號(並運行信號處理程序) - 但沒有指定哪一個。

如果當您嘗試改變信號處理器在孩子依賴於CLONE_SIGHAND標誌會發生什麼。如果沒有設置,那麼孩子可以愉快地撥打sigaction更改信號處理程序而不影響父母;但是如果設置了CLONE_SIGHAND,那麼當孩子撥打sigaction時,信號處理程序會針對整個過程進行更改。另請注意,如果您指定CLONE_THREAD,則還必須指定CLONE_SIGHAND

但是,孩子可以使用sigprocmask來掩蓋SIGVTALRM信號,而不會影響父母。