2017-04-22 67 views
1

我正在製作一個程序,它像服務器一樣運行,因此它一直在運行poll。我需要同時處理Ctrl - CCtrl - D。雖然按Ctrl - d是很容易的工作使用poll時(你剛纔也pollPOLLINstdin),我不能拿出了信號的漂亮的解決方案。我需要創建一個虛擬文件,當信號處理程序退出時,它會寫入一些內容,或者管道很適合這個目的嗎?使用poll()時正確處理Ctrl-C

+0

Pipe =虛擬文件?或者你是在說寫一個文件到磁盤?從poll()捕獲信號的正常解決方案是從信號處理程序向一個非阻塞管道寫入一個字節。 –

+0

請標記正確的平臺(Linux?) –

+0

@DietrichEpp我的意思是創建一個'pipe'並寫入它,如果SIGINT'來了。 – RomaValcer

回答

1

signalfd是你所追求的 - 將其連接到SIG_INT,你可以查詢CTRL + Ç –看到提供的(相當上下頁–實際上鍊接的例子,他們捕捉CTRL + c那裏......)。

0

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),但禁止使用fprintfmalloc一個訊號處理器中。仔細閱讀signal(7)signal-safety(7)

+0

感覺像signalfd是一個更好的解決方案,因爲它是針對這種情況的內置解決方案。 – RomaValcer

+1

Scratch that,signalfd是Linux的東西,顯然,對於macOS compat,你仍然需要這個。 – RomaValcer