/ /ターミナル、シグナル、zsh、ターミナルエミュレータ、less-unixの代替画面とバックグラウンドサスペンションの使用に関して、「less」の起動はZSHの「cat」の起動とどのように異なりますか

ターミナル、シグナル、zsh、ターミナルエミュレータ、less-unixなどの代替スクリーンとバックグラウンドサスペンドの使用に関して、ZSHの `cat`を起動することと` `less``の違いはどのように違いますか?

この質問には少しセットアップがあります。

私の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 も切り替えられています。シェルは常にどのように送信できますか SIGTTOUless、他の方法がない限り 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 何かを出力する前に。