我正在製作一個程序,它像服務器一樣運行,因此它一直在運行poll
。我需要同時處理Ctrl - C和Ctrl - D。雖然按Ctrl - d是很容易的工作使用poll
時(你剛纔也poll
爲POLLIN
上stdin
),我不能拿出了信號的漂亮的解決方案。我需要創建一個虛擬文件,當信號處理程序退出時,它會寫入一些內容,或者管道很適合這個目的嗎?使用poll()時正確處理Ctrl-C
回答
signalfd是你所追求的 - 將其連接到SIG_INT,你可以查詢CTRL + Ç –看到提供的(相當上下頁–實際上鍊接的例子,他們是捕捉CTRL + c那裏......)。
如Dietrich Epp所述,通常處理這種情況的方法是「自我管理」技巧。首先,在初始化時間,您設置了一個pipe(7):您將調用pipe(2),並且您在某些(例如全局)數據中同時保留了該管道的讀取和寫入文件描述符。您的信號處理程序將write(2)寫入一些字節(可能是單個0字節...)。而當你的事件循環圍繞着poll(2)(或者更老的select(2),等等),當讀取結束文件描述符有一些數據時,會響應read(2) -ing字節。
這種自我欺騙的管道對於所有的POSIX系統來說都很常見和便攜,並且推薦例如by Qt。
signalfd(2)系統調用是Linux專用的(例如,您在MacOSX上沒有)。一些舊的Linux內核可能沒有它。
請注意,集合的信號處理器中使用的功能僅限於異步信號安全功能 - 所以你被允許使用write(2),但禁止使用fprintf
或malloc
一個訊號處理器中。仔細閱讀signal(7)和signal-safety(7)。
感覺像signalfd是一個更好的解決方案,因爲它是針對這種情況的內置解決方案。 – RomaValcer
Scratch that,signalfd是Linux的東西,顯然,對於macOS compat,你仍然需要這個。 – RomaValcer
- 1. 正確處理NServiceBus超時
- 2. 用TYPO3和Fluid正確處理時區
- 3. 正確處理24小時時間
- 4. 用javascript正確處理cssRules
- 5. 使用XMLReader正確處理XML文件
- 6. 正確處理資源使用SmtpClient
- 7. 如何正確使用Express.js處理SIGINT?
- 8. 使用React Native正確處理註銷
- 9. 正確處理庫
- 10. 正確處理StaleObjectStateException
- 11. 正確處理DbConnection
- 12. 處理SSL_shutdown正確
- 13. 正確處理DomainOperationException
- 14. 正確處理didReceiveMemoryWarning
- 15. 正確處理WebExceptions?
- 16. python多處理管道poll問題
- 17. 抓取時正確處理ASP.NET頁面
- 18. 測試正確的時區處理
- 19. 如何正確處理時區轉換?
- 20. 如何在處理表面矢量時正確使用SDL_FreeSurface
- 21. 如何使用json和javascript/jquery正確處理db時間值
- 22. 如何在使用boost :: filesystem時正確處理錯誤?
- 23. 如何正確處理使用CakePHP的時間戳?
- 24. 在處理集合時正確使用屬性
- 25. 如何在使用StreamContent時正確處理流
- 26. Firefox在使用IHttpHandler時沒有正確處理內容類型
- 27. 如何在處理monorepo時正確使用lerna和webpack
- 28. 使用多處理時輸出不正確
- 29. 如何正確處理使用捲曲時的gzip頁面?
- 30. 在處理char數組時處理NULL char的正確方法
Pipe =虛擬文件?或者你是在說寫一個文件到磁盤?從poll()捕獲信號的正常解決方案是從信號處理程序向一個非阻塞管道寫入一個字節。 –
請標記正確的平臺(Linux?) –
@DietrichEpp我的意思是創建一個'pipe'並寫入它,如果SIGINT'來了。 – RomaValcer