2010-05-04 55 views
1

人。對於學術練習,我必須在c語言中爲nix平臺實現一個程序,該程序通過信號處理來同步多個進程,僅使用信號,暫停,終止和分叉基本函數。 我搜索谷歌,還沒有找到任何明確的例子:我希望你們中的一個人的智慧會照亮我的方式。 謝謝!如何通過基本信號處理同步c中的多個進程

+0

哎呀,虐待狂教授警惕。他有沒有聽說過鎖和信號燈? – 2010-05-04 06:01:38

+0

@atreyu:「flock」怎麼樣(http://linux.die.net/man/2/flock)? – outis 2010-05-04 06:32:15

+0

感謝您的反饋: @Keith信號量在下一個練習中,這只是爲了教育 - 虐待目的 @outis好點,但我害怕我只能使用信號處理的基本功能 – jneira 2010-05-04 06:37:50

回答

2

pause直到收到信號纔會返回。基本設計是這樣的:

  • fork在每個工人創造必要的工作人員
  • SIGINT。該處理程序設置一個標誌,意味着該進程在完成當前工作後應該退出。
  • 每個過程都可以工作,然後pause s。重複,除非收到SIGINT(在pause之後&之前的測試)。
  • 當一個過程具有可用於另一過程的工作,它用信號與SIGCONT
  • 其他進程存在對過程中沒有更多的工作時,與SIGINT信號它。

這並不完全包括對共享數據的同步訪問。當一個進程信號的另一個工作是可用的,它應該pause

當然,這恰恰違背了併發編程的目的

  • :要做到這一點,你可以添加額外的規則。由於大多數系統調用被信號中斷(導致它們返回-1,其中errno設置爲EINTR),因此您必須處理這種意外情況,重複每個受影響的系統調用,直到成功爲止。例如:

    while ((readCount = read(...)) < 0 && errno == EINTR) {} 
    
+0

我用類似的設計完成了練習,謝謝! – jneira 2010-05-05 05:31:34

+0

雖然這似乎是一個好主意,但如果兩個進程在短時間內都發送一個其他進程爲SIGCONT,則該進程可能會失敗,因爲該進程可能只會收到一個SIGCONT,從而「失去」第二個工作(請參閱我的文章細節)。通過給每個工作人員一個「隊列」作業並將SIGCONT的解釋從「作業已準備就緒」更改爲「至少有一個作業已準備就緒」,可以解決此問題,但這需要能夠自動更新隊列...在循環中使用文件系統重命名可能實現? – 2010-05-05 05:50:10

+1

@j:這是'SIGCONT'在我的大綱中的功能:打破'暫停'。請注意,「每個流程都可以運行。」 「暫停」和「SIGCONT」僅僅是爲了防止忙碌等待。 – outis 2010-05-05 09:15:23

2

需要注意的一件重要的事情是,Linux(至少和可能還有很多其他Unices)可以將同一類型的多個信號合併爲一個實例。因此,如果您發送一個處理值爲x的信號,則該過程將被保證接收;但是如果您發送兩個或更多值爲x的信號,則該過程只能保證至少接收其中一個信號。

另外,信號不保證按照發送順序接收信號。 (爲什麼?在引擎蓋下,Linux爲每個進程記錄哪些未完成的信號已經發送,每當進程被調度程序喚醒時,爲所有未完成信號的信號處理程序以任意順序運行。 )

這一切意味着信號通常不適合同步過程。它們只在信號之間的時間間隔相對於接收過程的喚醒時間之間的間隔較大時纔可靠地工作。如果一個過程花費了很多時間,喚醒事件可以任意分開。

結論:不要使用IPC的信號。

+0

也許這個作業的重點是要顯示所有的。 – mouviciel 2010-05-04 07:41:51

+0

jum the lesson is more complete with this point thanks – jneira 2010-05-04 14:53:22