Zshzsh:為什麼即使我有
zsh:為什麼即使我有stty -tostop
,我也會暫停後台程序?
我喜歡我的後台程序可以自由地寫入 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 信號(導致該消息),當它進行
TCSETSW
或TCSETS
ioctl()
例如(如使用tcsetattr()
libc 函式時)設置 tty 行規則設置而不在終端的前台程序組中時(如當從互動式 shell 在後台呼叫),無論是否tostop
啟用(僅影響對終端的寫入)。$ stty echo & [1] 290008 [1] + suspended (tty output) stty echo
有關詳細資訊,請參見
info libc SIGTTOU
GNU 系統:
- 宏:int SIGTTOU
這類似於
SIGTTIN
,但在後台作業中的程序嘗試寫入終端或設置其模式時生成。同樣,預設操作是停止程序。 如果設置了輸出模式,SIGTTOU
則僅生成嘗試寫入終端TOSTOP
(強調我的)
我相信這不是唯一
ioctl()
可能導致這種情況的原因。粗略看一下 Linux 核心原始碼,看起來像TCXONC
(tcflow()
) ,TCFLSH
(tcflush()
) 應該也是。