人。對於學術練習,我必須在c語言中爲nix平臺實現一個程序,該程序通過信號處理來同步多個進程,僅使用信號,暫停,終止和分叉基本函數。 我搜索谷歌,還沒有找到任何明確的例子:我希望你們中的一個人的智慧會照亮我的方式。 謝謝!如何通過基本信號處理同步c中的多個進程
回答
pause
直到收到信號纔會返回。基本設計是這樣的:
fork
在每個工人創造必要的工作人員- 抓
SIGINT
。該處理程序設置一個標誌,意味着該進程在完成當前工作後應該退出。 - 每個過程都可以工作,然後
pause
s。重複,除非收到SIGINT
(在pause
之後&之前的測試)。 - 當一個過程具有可用於另一過程的工作,它用信號與
SIGCONT
- 其他進程存在對過程中沒有更多的工作時,與SIGINT信號它。
這並不完全包括對共享數據的同步訪問。當一個進程信號的另一個工作是可用的,它應該pause
當然,這恰恰違背了併發編程的目的
- :要做到這一點,你可以添加額外的規則。由於大多數系統調用被信號中斷(導致它們返回-1,其中
errno
設置爲EINTR
),因此您必須處理這種意外情況,重複每個受影響的系統調用,直到成功爲止。例如:while ((readCount = read(...)) < 0 && errno == EINTR) {}
我用類似的設計完成了練習,謝謝! – jneira 2010-05-05 05:31:34
雖然這似乎是一個好主意,但如果兩個進程在短時間內都發送一個其他進程爲SIGCONT,則該進程可能會失敗,因爲該進程可能只會收到一個SIGCONT,從而「失去」第二個工作(請參閱我的文章細節)。通過給每個工作人員一個「隊列」作業並將SIGCONT的解釋從「作業已準備就緒」更改爲「至少有一個作業已準備就緒」,可以解決此問題,但這需要能夠自動更新隊列...在循環中使用文件系統重命名可能實現? – 2010-05-05 05:50:10
@j:這是'SIGCONT'在我的大綱中的功能:打破'暫停'。請注意,「每個流程都可以運行。」 「暫停」和「SIGCONT」僅僅是爲了防止忙碌等待。 – outis 2010-05-05 09:15:23
需要注意的一件重要的事情是,Linux(至少和可能還有很多其他Unices)可以將同一類型的多個信號合併爲一個實例。因此,如果您發送一個處理值爲x的信號,則該過程將被保證接收;但是如果您發送兩個或更多值爲x的信號,則該過程只能保證至少接收其中一個信號。
另外,信號不保證按照發送順序接收信號。 (爲什麼?在引擎蓋下,Linux爲每個進程記錄哪些未完成的信號已經發送,每當進程被調度程序喚醒時,爲所有未完成信號的信號處理程序以任意順序運行。 )
這一切意味着信號通常不適合同步過程。它們只在信號之間的時間間隔相對於接收過程的喚醒時間之間的間隔較大時纔可靠地工作。如果一個過程花費了很多時間,喚醒事件可以任意分開。
結論:不要使用IPC的信號。
- 1. 如何通過到達的順序處理多個信號C
- 2. c中的子進程信號處理
- 3. 處理同步信號
- 4. C多個進程之間的UNIX信號量同步
- 5. 基於信號量的基於opencv的圖像處理同步
- 6. C++應用程序中的多個信號處理程序
- 7. 在C中使用信號量進行多線程處理
- 8. shell/kernel如何處理信號發送到同一進程組中的進程?
- 9. 多線程信號處理
- 10. 可以通過進程sighandler處理linux信號SIG_KILL嗎?
- 11. mutlti-threaded過程中的信號處理
- 12. C++中的信號處理
- 13. 多進程信號處理程序中的奇怪結果
- 14. 多線程Python中的信號處理
- 15. 處理多個信號
- 16. 如何在Python中使用單獨的線程進行異步信號處理
- 17. Python多處理進程號
- 18. 如何通過不同的.net(c#)線程處理多個SQL事務
- 19. 信號處理 - 異步函數和多線程應用程序,信號棧
- 20. 使用信號量同步進程
- 21. 處理異步信號在多線程程序
- 22. 二進制信號量在C++中同步線程
- 23. C++ - 如何分塊文件進行同步/異步處理?
- 24. Python多處理 - 兩個進程之間的函數式通信
- 25. 如何通過多進程訪問相同的變量C/C++
- 26. 僅限於主進程的C Linux信號處理程序
- 27. 如何註冊子進程的信號處理程序?
- 28. Python多重處理:避免在進程之間通過模塊進行通信
- 29. 如何處理多個TCP客戶機進行通信
- 30. 多進程同步 - 比信號量更好的選擇?
哎呀,虐待狂教授警惕。他有沒有聽說過鎖和信號燈? – 2010-05-04 06:01:38
@atreyu:「flock」怎麼樣(http://linux.die.net/man/2/flock)? – outis 2010-05-04 06:32:15
感謝您的反饋: @Keith信號量在下一個練習中,這只是爲了教育 - 虐待目的 @outis好點,但我害怕我只能使用信號處理的基本功能 – jneira 2010-05-04 06:37:50