2016-11-22 34 views
1

我正在研究一個Tcl項目,其中某個過程將持續運行。用戶可以隨時使用一些密鑰組合中止該程序。所以基本上,我需要trap這個信號在Tcl之內的代碼。到目前爲止,除了一個問題,一切都完成了。什麼是可以在Tcl中捕獲的linux信號

我正在使用Ctrl+ZSIGSUSP信號(在Tcl的情況下爲SIGTSTP),它在技術上完成這項工作。

signal trap sigtstp onAbort 

但是,按壓Ctrl+Z立即返回Shell提示符,從該程序的輸出的其餘來自後和當輸出玩完,無殼提示返回(因爲它已之前返回)。我需要再次按Enter才能得到提示。

以下是我所指的情況。你可以看到在主程序輸出之間返回的提示符([email protected]:~$)。

enter image description here

另外,作爲按壓Ctrl+Z的輸出,它返回[40]+ Stopped,這是有點討厭。我能避免這種情況嗎?

我可以使用其他組合鍵來避免這個問題嗎?或者我還可以通過點擊某些東西來避免這種情況,Ctrl+Z

注:我試過使用Ctrl+C。我得到了完全預期的行爲。不幸的是,我不能使用Ctrl+C,因爲它用於其他功能。

回答

2

ÇŽ使shell發送當前前臺進程一個SIGSTOP(19)。這個信號不能被捕獲或忽略,所以你的程序會收到它並運行默認處理程序。這不是因爲你的問題表明你正在嘗試去完成這個過程。這隻會暫停它,你可以使用fg on most modern shells將它帶回前臺。

看起來你運氣不好。但是,您可能能夠在shell的級別重新綁定鍵。儘管這是您的程序之外,您的最終用戶無法控制它。 (參考https://superuser.com/questions/378018/how-can-i-do-ctrl-z-and-bg-in-one-keypress-to-make-process-continue-in-backgroun

另外,如果你的程序依賴於用戶輸入的各種操作(因爲你建議C-c做其他事情),也許你應該使用curses或其他東西使它成爲一個完整的CUI應用程序?

+1

實際上,'Ctrl' +'z'發送一個SIGTSTP,它可以被攔截。仍然強烈建議在發送該流程時停止流程,但可以在途中完成一些清理(例如,終端的清理)。 –

+0

謝謝!我沒有意識到這一點。 –

相關問題