この質問には少しセットアップがあります。
私のOSでは、デフォルトでZSHには -tostop
(またはttyですか?)。
これにより、バックグラウンドプロセスは、出力があるときにシェルに出力できます。
したがって:
> stty -tostop
> echo "random" >/tmp/random
> cat /tmp/random &
[1] 7588
random
[1] + 7588 done cat /tmp/random
対応して:
> stty tostop
> echo "random" >/tmp/random
> cat /tmp/random &
[1] 3888
[1] + 3888 suspended (tty output) cat /tmp/random
ドキュメントを読んで少し試してみると、ZSHには4種類の中断されたプロセスがあることがわかりました(これは、 kill -$SIGNAL $PID ; jobs
):
job state - signal that gives you job state
suspended - SIGTSTP
suspended (signal) - SIGSTOP
suspended (tty input) - SIGTTIN
suspended (tty output) - SIGTTOU
これは、 3888
プロセスはSIGTTOUシグナルを受信しています。
これはすべて理にかなっています。
さて、私の質問は、なぜですか? less
「影響を受けない」 stty tostop
または stty -tostop
?
> stty tostop
> less /tmp/random &
[1] 6300
[1] + 6300 suspended (tty output) less --LONG-PROMPT --chop-long-lines /tmp/random
> stty -tostop
> less /tmp/random &
[1] 4808
[1] + 4808 suspended (tty output) less --LONG-PROMPT --chop-long-lines /tmp/random
どちらの場合でもわかるように、 less
バックグラウンドで常に中断されています。
今、私は知っています less -X
、また、ターミナルエミュレータの代替画面機能についても知っています。 実際、次の2つのコマンドを実行できます。 less -X
、そしてそれは同じ種類のサスペンションをもたらします。 たとえ -X
代替画面を使用しないようにします。 suspended (tty output)
!
私が知りたいのは、実際の仕組みです less
常に中断されています suspended (tty output)
、 ときでさえ tostop
切り替えられます -X
も切り替えられています。シェルは常にどのように送信できますか SIGTTOU
に less
、他の方法がない限り less
中断されています。
回答:
回答№1は1(OSを指定しませんが、この回答はLinuxに基づいています)
使用 strace
あなたが見ることができます stty
している ioctl
fd 0(stdin)で1ビットをトグルする c_lflag
termios構造体の値。
strace
それも明らかにします less
開くでしょう /dev/tty
そして、 ioctl
それを変更するには c_lflag
.
そう less
単純に同じことをします stty tostop
何かを出力する前に。