回答:
で述べたように、ウィリアムPursell、less端末からユーザーのキーストロークを読み込みます。/dev/tty制御端末を明示的に開きます。これは、ユーザーの対話型入力を読み取ることができる標準入力とは別のファイル記述子を提供します。必要に応じて、標準入力から表示するデータを同時に読み取ることができます。(必要に応じて、端末に直接書き込むこともできます。)
これを実行すると、次のようになります。
some_command | strace -o less.trace -e open,read,write less
入力を移動し、exit less、およびの内容をless.trace見てください。openが表示され/dev/tty、ファイル記述子0と、開いたときに返されたファイル記述子/dev/tty(おそらく3)の両方から読み取ります。
これは、端末からの読み取りおよび端末への書き込みを確実に行うことを望むプログラムの一般的な方法です。一つの例は、SSH、ある例えばそれは、パスワードやパスフレーズを要求する場合。
説明によってシリー、あれば/dev/tty開くことができない、lessその標準エラー(ファイルディスクリプタ2)から読み込まれます。lessの使用は/dev/tty、1991年4月2日にリリースされたバージョン177で導入されました。
あなたが実行してみる場合cat /dev/tty | lessなど、提案によってハーゲン・フォン・Eitzen、less開口部に成功します/dev/ttyが、それまでの任意の入力を取得することはありませんcatが閉じて。そのため、画面を空白にして、押す(または他の方法でCtrlC殺すcat)を押すまで何も表示されません。その後、lessあなたは一方で入力したものは何でも表示されますcat実行している、とあなたはそれを制御することができました。
cat blah |置き換えることができると思いますが< blah、この場合も機能するのでそれは不要ですless blah(まあ、less -f /dev/tty)。ただし、からの読み取り/dev/ttyは少し特殊なケースであり、3つのバリアント(cat /dev/tty | less、less < /dev/ttyおよびless -f /dev/tty)はすべて異なる結果を生成します。
UNIXには、stdinがリダイレクトされている間にユーザー入力を読み取るための2つの方法があります。
元の方法はstderrから読み取ることです。Stderrは書き込みおよび読み取り用に開かれていますが、これはPOSIXでも引き続き言及されています。
それ以降のUNIXバージョンでは(1979年頃)/dev/tty、プロセスの制御ttyを開くことができるドライバーインターフェイスが追加されました。制御ttyのないプロセスがあるため、開く試みが/dev/tty失敗する可能性があります。したがって、わかりやすいソフトウェアは、元のメソッドにフォールバックしてから、stderrから読み取ろうとします。
dup()同じファイル記述のlicatesですが、すべてttyで開かれています。(stderrのようなもので開かれていない、読み取り/書き込みFDであること)どうやらPOSIXはまだ必要ですか。この答えは言いません(提案open("/dev/ttyS0", O_WRONLY)リーディングstderrが、その場合には失敗します。)
lessstdinから表示するデータを読み取り、ttyからコマンドを読み取ります。それらは異なるものです。