zsh:「stty -tostop」があってもバックグラウンドプロセスが中断されるのはなぜですか?

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)

ベストアンサー1

TCSETSWプロセスが端末のフォアグラウンドプロセスグループに属していない場合TCSETS ioctl()(たとえば、libc関数を使用している場合)、アクティブかどうかtcsetattr()にかかわらず、ttyラインルール設定が設定されます(たとえば、インタラクティブシェルからバックグラウンドで呼び出される場合)。tostop影響を与える書くターミナルへ)。

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

詳しくはinfo libc SIGTTOUGNUシステムをご覧ください。

  • マクロ: int SIGTTOU

    SIGTTINこれは、バックグラウンドジョブのプロセスが端末に書き込もうとしたときと似ていますが、生成されます。またはモードを設定してください。繰り返しますが、基本的な作業はプロセスを停止することです。出力モードが設定されている場合は、SIGTTOU端末に書き込もうとしたときにのみ生成されます。 TOSTOP

(強調は私のもの)

私はこれがこれの唯一の理由ではないと思いますioctl()。 Linuxカーネルのソースコードをよく見てみると、TCXONCtcflow())とTCFLSHtcflush())も同じになるはずです。

おすすめ記事