Unixでは、読み取りと書き込みが可能なほとんどのオブジェクト(通常のファイル、パイプ、ターミナル、rawディスクドライブ)はすべてファイルに似せて作られています。
次のようなcat
標準入力から読み取るようなプログラム:
n = read(0, buffer, 512);
512バイトを要求します。n
実際に読み取られたバイト数、またはエラーがある場合は-1です。
これを通常のファイルで繰り返し実行すると、512バイトの読み取りが大量に行われ、ファイルの末尾で多少短い読み取りが行われ、ファイルの末尾を超えて読み取ろうとすると0になります。したがって、<= 0 にcat
なるまで実行されn
ます。
端末からの読み取りはわずかに異なります。Enterキーで終了する行を入力すると、read
その行だけが返されます。
入力できるいくつかの特殊文字があります。1つはCtrl-Dです。これを入力すると、オペレーティングシステムは、入力した現在の行すべて(Ctrl-D読み取りではない)を読み取りを行うプログラムに送信します。そして、これは偶然のことです:Ctrl-D行の最初の文字である場合、プログラムには長さ0の行が送信されます-プログラムがちょうど普通のファイルの終わりに到達したかどうかを見るように。通常のファイルから読み取るか、端末から読み取るかに関係なく、cat
別のことを行う必要はありません。
もう1つの特殊文字はCtrl-Zです。行のどこかに入力すると、オペレーティングシステムはその時点までに入力したものをすべて破棄し、プログラムにSIGTSTPシグナルを送信します。SIGTSTPシグナルは通常、プログラムを停止(一時停止)し、制御をシェルに返します。
あなたの例では
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
破棄された文字を入力した後cat
、出力ファイルに何も書き込まずに停止しました。
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
1行で入力しcat
、出力ファイルの読み取りと書き込みを行った後、Ctrl-Z停止しましたcat
。