今ちょうど方法を学び始めました。すべてがファイルですTM on Linuxでは、/dev/stdoutをそのまま読むと何が起こるのか疑問に思います。
$ cat /dev/stdout
^C
$ tail /dev/stdout
^C
(これは^C
プログラムが中断された後にプログラムを終了することです。)
使用しようとすると、vim
「/dev/stdout」がファイルではありませんという想像できないメッセージが表示されます。喧嘩!
それでは、これらの「ファイル」を読み取ろうとすると、途切れやエラーメッセージが表示されるのはなぜですか?
答え1
私はなぜ電話を切る?
cat(1)
とで「停止」は発生せず、読み取りのみがtail(1)
ブロックされます。 cat(1)
入力を待ってから行全体が表示されたら、すぐに印刷します。
$ cat /dev/stdout
foo
foo
bar
bar
foo
Enterbar
EnterCTRL私は-hereと入力しますD。
tail(1)
入力を待って検出された場合にのみ印刷しますEOF
。
$ tail /dev/stdout
foo
bar
foo
bar
foo
Enterbar
EnterCTRLここに - を再入力しますD。
またはエラーメッセージ
Vimはエラーを発生させる唯一のツールです。それがその理由はそれだからです。走る stat(2)
これに対応するビットが設定されていない/dev/stdout
ことがわかりましたS_IFREG
。
/dev/stdout
ファイルですが、定期的な文書。実際、カーネルにはファイルシステムにアイテムを提供するダンスがあります。 Linuxの場合:
$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May 8 19:42 /dev/stdout -> /proc/self/fd/1
OpenBSDから:
$ ls -l /dev/stdout
crw-rw-rw- 1 root wheel 22, 1 May 7 09:05:03 2015 /dev/stdout
FreeBSDから:
$ ls -l /dev/stdout
lrwxr-xr-x 1 root wheel 4 May 8 21:35 /dev/stdout -> fd/1
$ ls -l /dev/fd/1
crw-rw-rw- 1 root wheel 0x18 May 8 21:35 /dev/fd/1
答え2
(ほぼ)すべてがファイルですが、すべてがファイルではありません。定期的な文書。特殊ファイル(ディレクトリ、ネットワークソケット、シリアルポートなど)に対してテキストエディタを呼び出す必要はありません。
このファイルは、/dev/stdout
UNIX のバリエーションによって次のいずれかです。
- 「特殊」ファイル、通常文字デバイス。
- この記述子にアクセスするプロセスによって開かれたファイルを指す「魔法の」シンボリックリンク。
- 上記のいずれかのシンボルリンクです。
いずれにせよ、/dev/stdout
同様のファイルを開くと、アプリケーションは、ファイル記述子 1 ですでに開かれたものと同じファイルに関連付けられた新しいファイル記述子を生成します。 「Stdout」はファイル記述子1を意味し、これは出力にこのファイル記述子を使用するための規則にすぎません。カーネルは気にしません。
端末でプログラムを実行すると、3つの標準記述子(0 =標準入力、1 =標準出力、2 =標準エラー)がすべて端末装置で開きます。このデバイスから読み取るとユーザーが入力した文字が返され、デバイスに書き込むと端末ウィンドウにテキストが表示されます。 (指定された端末装置が表示する出力を読み取ったり、入力を注入する標準的な方法はありません。)
これを実行すると、cat /dev/stdout
3つのファイル記述子が同じファイルにリンクされているため、まったく同じことが行われます。端末から読むように指示します。これも間違いない事実です。cat /dev/stdin
cat /dev/stderr
cat
cat
このファイルは、対応するコマンドをcat /dev/stdout >foo
実行すると/dev/stdout
参照されます。実装によってはエラーが発生するか(GNUバージョンでは「入力ファイルは出力ファイルです」と文句を言う)、空のファイルの読み取りから始まるため、何もしないことがあります。 (ただ切ります)。この特別なケースを検出できないバージョンの場合、空でない場合は、そのファイルの内容が無期限に追加されます。foo
cat foo >foo
cat
foo
>foo
cat
foo
cat /dev/stdout >>foo
cat foo >>foo
を実行すると、vim /dev/stdout
端末を編集する方法がわからないので文句を言います(言葉ではありません)。
答え3
cat
オプションのコンテンツとtail
ファイルの終わりを探しています。/dev/stdout
まだ開いているので、cat
探しtail
てみてください。