フォアグラウンドプロセスでSIGTTIN SIGTTOUを送信してキャッチしますか?

フォアグラウンドプロセスでSIGTTIN SIGTTOUを送信してキャッチしますか?

信号の説明によると(引用する)、SIGTTIN、およびSIGTTOUは、バックグラウンドにあるときにのみプロセスに送信されるようです。これらのフロー制御が有効になっている場合、キーを押すとCtrl-s端末から印刷が停止します。したがって、問題は、SIGTTIN / SIGTTOU信号を現在のフォアグラウンドにあるプロセスに実際に転送してそれをキャプチャすることが可能ですか?

たとえば、次のコードをファイルに保存しchmod +xて実行します。次にCtrl-s/を押しますCtrl-q。印刷がCtrl-s停止して再開することを確認できますCtrl-q。ただし、ファイル./trap.logファイルは空です。

#!/usr/bin/env zsh
touch ./trap.log
trap 'echo TSTP >>./trap.log' TSTP
trap 'echo TTIN >>./trap.log' TTIN
trap 'echo TTOU >>./trap.log' TTOU
trap 'echo CONT >>./trap.log' CONT
for ((i=1;i>0;i=i+1)); do
    printf "print $i\n"
    sleep 1
done

答え1

kill他の信号と同様に、SIGTTINまたはSIGTTOUを送信できます。trap他の(キャッチできる)信号と同様に、(shから)これをキャッチできます。しかし、それは信号Ctrl+Sとは関係ありませんCtrl+Q。これはアプリケーションではなく端末で処理されます。

アプリケーションが「出力一時停止」コマンドとして処理するようにするには、Ctrl+S端末がこれらの文字(stty -ixoffまたはtcsetattr同等の文字)をキャプチャせずに他の入力と同じように処理することを確認してください。

関連情報