私はほとんど興味がありますが、なぜ/ devにネットワークインターフェースがないのですか?/ devの下のノードとして表されない他の種類のデバイスはありますか?
read()
し、write()
そのファイルの場合と同じように、しかし、ユーティリティ関数recv()
とsend()
あなたのためのより多くの取材を行います。
私はほとんど興味がありますが、なぜ/ devにネットワークインターフェースがないのですか?/ devの下のノードとして表されない他の種類のデバイスはありますか?
read()
し、write()
そのファイルの場合と同じように、しかし、ユーティリティ関数recv()
とsend()
あなたのためのより多くの取材を行います。
回答:
多くのデバイスの主な操作は、コンピューターから周辺機器にバイトを送信すること、またはコンピューター上の周辺機器からバイトを受信することです。そのようなデバイスはパイプに似ており、キャラクターデバイスとしてうまく機能します。読み取りおよび書き込みではない操作(シリアル回線のフロー制御など)に対して、デバイスはioctlと呼ばれるアドホックコマンドを提供します。
一部のデバイスは、通常のファイルに非常によく似ています。それらは有限のバイト数で構成されており、特定の位置に書き込んだものは、後で同じ位置から読み取ることができます。これらのデバイスはブロックデバイスと呼ばれます。
ネットワークインターフェイスはより複雑です。読み取りと書き込みはバイトではなくパケットです。read
とwrite
で通常のインターフェースを使用することは依然として可能ですが、厄介です:おそらく各呼び出しwrite
はパケットを送信し、各呼び出しread
はパケットを受信します(そして、バッファーが小さすぎてパケットが収まらない場合、パケットが失われます)。
ネットワークインターフェースは提供するだけのデバイスとして存在できましたioctl
。実際、これは一部のUNIXバリアントで実行されますが、Linuxでは実行されません。このアプローチにはいくつかの利点があります。たとえば、Linuxでは、ネットワークインターフェイスはudevを活用できます。しかし、利点は限られており、それが実現されていない理由です。
ほとんどのネットワーク関連アプリケーションは、個々のネットワークインターフェイスを気にせず、より高いレベルで動作します。たとえば、WebブラウザはTCP接続を確立し、WebサーバーはTCP接続をリッスンする必要があります。この目的に役立つのは、高レベルのネットワークプロトコル用のデバイス、たとえば
{ echo $'GET http://www.google.com/ HTTP/1.0\r';
echo $'Host: www.google.com\r';
echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80
実際、kshおよびbashは、TCPおよびUDPクライアントにこのようなインターフェースを提供します。ただし、一般に、ネットワークアプリケーションはファイルアクセスアプリケーションよりも複雑です。ほとんどのデータ交換はread
およびwrite
に類似した呼び出しで行われますが、接続を確立するには単なるファイル名よりも多くの情報が必要です。たとえば、TCP接続のリッスンには2つのステップが必要です。1つはサーバーがリッスンを開始するときに実行され、もう1つはクライアントが接続するたびに実行されます。このような追加の手順は、ファイルAPIにうまく適合しません。これが、ネットワーキングに独自のAPIがある主な理由です。
通常/dev
Linuxにエントリを持たない(ただし、他のUNIXバリアントには含まれる)デバイスの別のクラスは、ビデオアダプタです。原則として、単純なビデオアダプタはフレームバッファデバイスとして公開できます。フレームバッファデバイスは、各ピクセルの色を表すブロックで構成されるブロックデバイスです。高速ビデオアダプタは、アプリケーションがコマンドを送信するキャラクタデバイスとして表すことができます。ここで、デバイスインターフェイスの欠点は遅いことです。表示アプリケーション(実際にはXサーバー)は、何かを表示するたびにカーネル呼び出しを行う必要があります。その代わりに、Xサーバーはほとんどの場合、ビデオアダプターのメモリに直接書き込みます。これは高速であるためです。
read
/ write
どちらか。mmap
マップされたファイルとデバイスメモリへの直接アクセスに使用できます。
/sys/class/net
ディレクトリで見つけることができます。それの他のファイルへのシンボリックリンクは/sys/device/../../
、次の私の仮想マシン(Linuxカーネル3.10)の出力です。そして、コマンドudevadm info <filename>
を使用してその属性を調べることができます
lrwxrwxrwx. 1 root root 0 Apr 3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
<>
マークアップとして解釈される別の方法で使用する場合は、インラインコードの周りで常に逆引用符を使用します。(名前を変更してASCII文字表記で開始することもできます。単純なキーボードを使用している人は、コメントに応答して名前の最初の文字を入力するのが難しいためです)
AT&T / SolarisのTCP / IPネットワーキングを行う「トランスポートレベルインターフェイス」(TLI)の方法には、「/ dev / tcp」や「/ dev / udp」などの特別なファイルがあります。プログラマはその特別なファイルを開いて、適切なプロトコルファミリのソケットを取得します。だからこそ、Solaris上でソケットを使用するプログラムをコンパイルするときに「-lnsl」を持たなければならないのだと思います。その下にあるのはTLIです。
/dev/tcp
ともあり/dev/udp
ますが、ほとんどのカーネルでは無効になっています。
従来のLinuxは完全にposix互換ではありませんでしたが、あらゆる種類のOpen Group標準(LSB以外の場合もあります)に準拠することは言うまでもありません。より多くのUNIX機能をLinuxに移植する試みがありました。
Glendixはそのようなプロジェクトの1つであり、Plan9の/ net仮想ファイルシステムのポートを提供します。これにより、説明どおりに行うことができます。