「すべてはファイルです」がUnixの主な概念の1つであることを知っていますが、ソケットは一般的なファイルシステムインタフェースとは異なり、カーネルが提供する他のAPI(ソケット、sendto、recvなど)を使用します。
ここで「すべてがファイルです」はどのように適用されますか?
答え1
ソケットは別のAPIを使用します。
これは完全に正確ではありません。ソケットで使用できるいくつかの追加機能がありますが、一般的な機能やread()
ソケットwrite()
fdなどを使用できます。
ここで「すべてがファイルです」はどのように適用されますか?
ある意味、ファイル記述子は関連しています。
「ファイル」の定義がファイルシステムに格納されている個々のバイトのシーケンスである場合、すべてがファイルではありません。ただし、ファイル定義がハンドル(情報フォワーダ、I / O接続)に似ている場合は、「すべてがファイルです」が理解し始めます。これらには必然的にバイトシーケンスが含まれていますが、どこから来て行くかは状況によって異なります。
しかし、これは文字通りではありません。 ㅏ悪魔デーモンはファイルではなくプロセスです。産業用コンピュータファイルスタイルエンティティは、他のプロセスに関連する方法を軽減する可能性が高いです。
答え2
「すべてがファイルです」という言葉は誇張された表現にすぎません。それ以前は1970年代小説以前はUNIXの主な特徴です。しかし、これはマーケティングの概念に過ぎず、UNIXの実際の基盤ではありません。なぜなら明らかに真実ではないからです。すべてをファイルとして扱うことには利点や知恵はありません。
CPUはファイルですか?あなたのプログラムは新しい命令を得るためにCPUを読みますか? RAMはファイルですか?あなたのプログラムは次のバイトを読みますか?
当時、フロッピーディスク用の単一API、ハードディスク用API、テープ用API、端末用APIなどを提供するいくつかのオペレーティングシステムがありました。 IBMメインフレーム・システムのハード・ドライブには、さまざまな種類のファイルがあり、信じられないように、または各ファイルにさまざまなAPIがあります。したがって、UNIXの「ファイルです」メソッドは、「stdin/stdout/stderr」メソッドとともに、ユーザーとプログラマーに非常にエレガントな抽象化を提供します。
ネットワークの場合、この特定の抽象化は機能しません。これは問題ではありません。ただ、オペレーティングシステムの全体的な優雅さと一貫性が少し少ないということです。しかし、動作します。/dev/myinternetz/www/google/com/tcp/80
今日のシステムのどこからでもファイルが呼び出されるのを見ますか?それを開き()クエリを作成()してから、きれいなHTML回答を読むことができますか?いいえ?これは、「ファイル」抽象化がネットワーク相互作用にあまり便利ではないためです。実際にはうまくいきません。漏れた抽象化の法則行動中。
答え3
ソケットはファイルです。ソケットでread
およびを使用できますwrite
。呼び出すのと同じです。recv
そしてsend
そしてflags=0
。次のコマンドを使用して閉じます。close
。次のコマンドを使用して移動できます。dup
ファイル記述子を混ぜる必要がある場合は、友達と一緒に作業してください。いくつかのフラグを設定できます。fcntl
、呼び出し後にstdioバッファリングを使用します。fdopen
。リストは続きます。非常に重要なのは、電話をかけることができるということです。select
そしてpoll
ソケットを含むすべての種類のファイル。したがって、これらの関数を使用すると、ファイル記述子を一覧表示するだけで、プログラムが何らかの方法で入力を受け取るまでブロックできます。
特定のソケットタイプ(recv
およびsend
、shutdown
など)、まるでデバイスに追加のシステムコールがあるかのように(ioctl
)。
すべてのファイルがあるわけではありません。名前、存在するディレクトリのうち、ディレクトリ構造に常に存在するわけではありません。生成されたパイプラインpipe
(例:シェルパイプから)および次によって生成されたソケットsocketpair
名前はありませんが、まだファイルです。ソケットコンストラクタsocket
ドメインによって構文が異なる名前があります。名前はstruct sockaddr
次のように渡されます。bind
そして他の機能。 Unix( AF_UNIX
) ソケットの場合、名前は次のとおりです。struct sockaddr_un
はファミリで文字列です。文字列に応じて、これはファイル名(mknod
名前付きソケットは多くのUNIXバリアントで生成される可能性があります)でも、そうでない場合もあります(抽象ネームスペース)。 IPv4( AF_INET
) ソケットの場合、名前は次のとおりです。struct sockaddr_in
、ポート番号、IPアドレス、通話が発生したprotocol
アドレスも含まれます。socket
答え4
ソケットなら、stat
iノード番号と一般ファイルの異なる特徴があることが分かるので、ファイルシステムではファイルに分類します。例:
# file live
live: socket
# stat live
File: `live'
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: fc03h/64515d Inode: 198817 Links: 1
Access: (0660/srw-rw----) Uid: (23129/ icinga) Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800
11/17。 Linux用の追加情報(ext3):ソケットにはinode(ディスクの256バイトブロック)がありますが、データブロックはありません(inodeを抽出してデータブロックポインタを確認するか、debugfs 'stat' showを実行してこれを確認できます)。ブロック数は0)。したがって、ファイルメタデータ(所有者、グループ、権限など)はありますが、ディスクにはデータコンテンツはありません。これは、ブロック数が0の一般的な空のファイル()と同じです。touch /tmp/foo
最初のケースでは、inodeの「type」フィールドに「socket」と表示され、「socket」と表示されます。 2番目のケースでは、「一般ファイル」と表示されます。
引用:ext2 インデックスノード構造、、、stat
およびコマンドdumpe2fs
。debugfs