テキストエディタを使用して/dev/stdoutを読み取れないのはなぜですか?

テキストエディタを使用して/dev/stdoutを読み取れないのはなぜですか?

今ちょうど方法を学び始めました。すべてがファイルです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

fooEnterbarEnterCTRL私は-hereと入力しますD

tail(1)入力を待って検出された場合にのみ印刷しますEOF

$ tail /dev/stdout
foo
bar
foo
bar

fooEnterbarEnterCTRLここに - を再入力します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/stdoutUNIX のバリエーションによって次のいずれかです。

  • 「特殊」ファイル、通常文字デバイス。
  • この記述子にアクセスするプロセスによって開かれたファイルを指す「魔法の」シンボリックリンク。
  • 上記のいずれかのシンボルリンクです。

いずれにせよ、/dev/stdout同様のファイルを開くと、アプリケーションは、ファイル記述子 1 ですでに開かれたものと同じファイルに関連付けられた新しいファイル記述子を生成します。 「Stdout」はファイル記述子1を意味し、これは出力にこのファイル記述子を使用するための規則にすぎません。カーネルは気にしません。

端末でプログラムを実行すると、3つの標準記述子(0 =標準入力、1 =標準出力、2 =標準エラー)がすべて端末装置で開きます。このデバイスから読み取るとユーザーが入力した文字が返され、デバイスに書き込むと端末ウィンドウにテキストが表示されます。 (指定された端末装置が表示する出力を読み取ったり、入力を注入する標準的な方法はありません。)

これを実行すると、cat /dev/stdout3つのファイル記述子が同じファイルにリンクされているため、まったく同じことが行われます。端末から読むように指示します。これも間違いない事実です。cat /dev/stdincat /dev/stderrcatcat

このファイルは、対応するコマンドをcat /dev/stdout >foo実行すると/dev/stdout参照されます。実装によってはエラーが発生するか(GNUバージョンでは「入力ファイルは出力ファイルです」と文句を言う)、空のファイルの読み取りから始まるため、何もしないことがあります。 (ただ切ります)。この特別なケースを検出できないバージョンの場合、空でない場合は、そのファイルの内容が無期限に追加されます。foocat foo >foocatfoo>foocatfoocat /dev/stdout >>foocat foo >>foo

を実行すると、vim /dev/stdout端末を編集する方法がわからないので文句を言います(言葉ではありません)。

答え3

catオプションのコンテンツとtailファイルの終わりを探しています。/dev/stdoutまだ開いているので、cat探しtailてみてください。

答え4

これを試してください

sudo su
chmod +x /dev/stdout
chmod +x /dev/stderr
exit su

私はそれを試してみました。あなたはそれを試して学ぶでしょう:)

なぜ必要なのかわかりませんか?誰でも説明できますか?

標準出力権限情報 標準入力権限情報 私の目標はハッピーエンドです

関連情報