2016-12-21 104 views
2

我已經寫在兩個獨立的程序(例如1 & 2)經由消息隊列進行通信的代碼。每個程序都會發送一條特定的消息mtype並等待特定的響應mtype。基於mtype函數被調用。程序2開始等待上select()上的消息隊列從節目1等待消息鏈引發和經由消息隊列每個全成通信鏈後回來select()等待下一通信鏈的節目1的引發。C:停止執行並跳轉到特定點在程序上接收信號

我想要的節目2必須通過停止執行返回到select()無論它的通信鏈之間在上殼體程序1從節目1接收到特定信號(比方說SIGUUSR1)發現在當前鏈的錯誤,並希望復位隨後將啓動一個新的通信鏈。

接收到該信號的程序,從所有的功能是在2點返回和直跳到select()

我後悔不共享一個代碼片斷,但我希望我做了我的觀點。

謝謝...

+0

使用信號處理程序,您可以在其中設置一個標誌,指示您需要返回到select()步驟。其餘的代碼可以檢查這個標誌並相應跳轉。 – codeforester

回答

1

如何:

  • 當程序2啓動時,它執行大部分的初始化,然後叉自身的副本。
  • 子進程創建套接字並連接到它,然後選擇並正常運行。
  • 當子進程接收SIGUSR1它表示需要重新啓動的狀態退出。
  • 父進程只是等待子進程退出,如果退出狀態表示需要重啓,則會分叉另一個子進程。 (任何其他退出狀態都會導致父母以相同的狀態退出)。

討論:

  • 重新啓動會比較慢(需要創建套接字等)。
  • 進程1需要知道消息隊列在發送時會斷開連接SIGUSR1
  • 這應該是非常可靠的,並且可以在Posix中移植。
  • fork位實際上只是一個優化。你可以讓父進程成爲某種腳本 - 在這種情況下,模型甚至可以移植到Windows上(顯然,腳本可能不同,但程序2的源代碼將是可移植的)。

唯一的另一種選擇是有某種標誌進程2「頻繁」輪詢。如果該標誌被設置,則該過程拋出異常(C++)或longjmp s(C)回到select調用。該標誌在信號處理程序中設置。

這種做法的問題是,)它打破如果事情發生在你停止輪詢標誌; b)編寫異常安全的代碼或者如果longjmp通過它不會泄漏資源是非常困難的。

相關問題