2011-05-09 57 views
3

我在vxworks手冊中發現了以下內容,並想知道爲什麼會出現這種情況。Linux/vxworks信號

信號做什麼類型的事情使他們不受歡迎?

在實際應用中,信號是 最適合用於錯誤和異常處理 ,而不是一個 通用任務間通信 。

回答

3

與信號的主要問題是處理程序是基於每個進程/內存空間基礎註冊的信號(在VxWorks中,內核表示一個存儲器空間,並且每個RTP是不同的存儲器空間)。

這意味着無論線程/任務上下文如何,都會執行相同的信號處理程序(對於給定的進程)。如果您的信號處理程序表現不好,這可能會導致一些副作用問題。

例如,如果你的信號使用一個互斥體的保護共享資源,這可能會導致討厭的問題,或者至少,意外的行爲

 
    Task A      Task B    Signal Handler 
    Take Mutex 
    ... 
    Gets preempted 
           does something 
           .... 
           <SIGNAL ARRIVES>----->Take Mutex (blocks) 
    resumes 
    .... 
    Give Mutex 
               ----->Resumes Handler 

我不知道上面的例子中真正傳達了我正在努力。 以下是信號的一些其他特性:

  • 處理程序在執行任務/過程之前不會執行。僅僅因爲您發送了信號,並不意味着處理程序將立即執行
  • 不保證Task/Thread將執行處理程序。進程中的任何線程/任務都可以運行它(無論哪個線程/任務先執行)。 VxWorks有辦法解決這個問題。

請注意,以上僅適用於通過kill調用發送的異步信號。

異常會產生一個同步信號,在當前上下文中馬上執行。