私は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 SIGTTOU
GNUシステムをご覧ください。
マクロ: int SIGTTOU
SIGTTIN
これは、バックグラウンドジョブのプロセスが端末に書き込もうとしたときと似ていますが、生成されます。またはモードを設定してください。繰り返しますが、基本的な作業はプロセスを停止することです。出力モードが設定されている場合は、SIGTTOU
端末に書き込もうとしたときにのみ生成されます。TOSTOP
(強調は私のもの)
私はこれがこれの唯一の理由ではないと思いますioctl()
。 Linuxカーネルのソースコードをよく見てみると、TCXONC
(tcflow()
)とTCFLSH
(tcflush()
)も同じになるはずです。