Sunday, November 15, 2009

解決 ctrl+s 使 terminal output STOP

解決 ctrl+s 使 terminal output STOP

一般可能不會注意到 ctrl+s 會使 terminal 送出 STOP 字元,使系統端暫停輸出,直到 terminal 送出 START 字元 (ctrl+q)。這就是我們在設定 UART 時,常會看到的 xon/xoff 的流量控制。這是透過特殊的字元,以控制 terminal 和 system 之間的資料傳送,以免一方傳送太快,而接收方來不及消化。因此,接收方在發覺傳送方傳送太多資料而來不及消化時,可傳送 STOP 字元,以暫停對方的輸出。並在之後,以傳送 START 字元恢復傳送。

一般的 terminal 會設定 ctrl+s 為 STOP 字元,而 ctrl+q 為 START 字元。預設使的 process 進入 stop 狀態(SIGTSTP),也就是暫停。許多程式,尤其是 editor 會使用 ctrl+s 的按鍵組合,這通常不會造成問題。但,有時在 screen 裡面時,因為特別原因, ctrl+s 會使的 screen 進入 stop 狀態,使程式無法接收到 ctrl+s 的 key code。在遇到這種問題時,可以透過 stty 設定該 terminal。

terminal 的名稱通常為 /dev/ttyXX,可以透過 ps 查詢。這時,執行下面指令

# stty -f /dev/ttyXX -ixon

使系統不處理 STOP 字元,如此 ctrl+s 就不會為 terminal device driver 所攔截。使用 ctrl+s 的軟體也就能順利執行。

No comments: