Zsh

zsh:為什麼即使我有stty -tostop,我也會暫停後台程序?

  • July 26, 2020

我喜歡我的後台程序可以自由地寫入 tty。stty -tostop已經是我的 zsh 中的預設設置(我不知道為什麼,也許是因為 OhMyzsh?):

❯ stty -a |rg tostop                                                                                                      
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt

但我仍然偶爾會暫停我的後台程序(這不是一致的行為,我不知道如何重現它):

[1]  + 3479064 suspended (tty output)

一個程序可以發送該 SIGTTOU 信號(導致該消息),當它進行TCSETSWTCSETS ioctl()例如(如使用tcsetattr()libc 函式時)設置 tty 行規則設置而不在終端的前台程序組中時(如當從互動式 shell 在後台呼叫),無論是否tostop啟用(僅影響對終端的寫入)。

$ stty echo &
[1] 290008
[1]  + suspended (tty output)  stty echo

有關詳細資訊,請參見info libc SIGTTOUGNU 系統:

  • 宏:int SIGTTOU

這類似於SIGTTIN,但在後台作業中的程序嘗試寫入終端或設置其模式時生成。同樣,預設操作是停止程序。 如果設置了輸出模式,SIGTTOU則僅生成嘗試寫入終端 TOSTOP

(強調我的)

我相信這不是唯一ioctl()可能導致這種情況的原因。粗略看一下 Linux 核心原始碼,看起來像TCXONC( tcflow()) ,TCFLSH( tcflush()) 應該也是。

引用自:https://unix.stackexchange.com/questions/600386