web-dev-qa-db-ja.com

ネットワークインターフェイスが他のデバイスのように/ devにないのはなぜですか?

私はたいてい興味がありますが、なぜ/ devにネットワークインターフェイスがないのですか?/devの下のノードとして表されない他の種類のデバイスはありますか?

79
andyortlieb

多くのデバイスでは、主な操作は、コンピューターから周辺機器へのバイトの送信、またはコンピューター上の周辺機器からのバイトの受信です。そのようなデバイスはパイプに似ており、 キャラクターデバイス としてうまく機能します。読み取りおよび書き込みではない操作(シリアルラインのフロー制御など)の場合、デバイスは ioctl と呼ばれるアドホックコマンドを提供します。

一部のデバイスは通常のファイルに非常によく似ています。それらは有限バイト数で作成されており、特定の位置に書き込んだものは後で同じ位置から読み取ることができます。これらのデバイスは ブロックデバイス と呼ばれます。

ネットワークインターフェイスはより複雑です。読み書きするのはバイトではなくパケットです。 readwriteを使用して通常のインターフェイスを使用することは可能ですが、扱いにくいことがあります。おそらく、writeを呼び出すたびにパケットが送信され、 readはパケットを受信します(バッファが小さすぎてパケットが収まらない場合、パケットは失われます)。

ネットワークインターフェイスは、ioctlのみを提供するデバイスとして存在する可能性があります。実際、これは一部のUNIXバリアントが行うことですが、Linuxはそうではありません。このアプローチにはいくつかの利点があります。たとえば、Linuxでは、ネットワークインターフェイスで dev を利用できます。しかし、利点は限られているため、これは行われていません。

ほとんどのネットワーク関連アプリケーションは、個々のネットワークインターフェイスを気にしません。より高いレベルで動作します。たとえば、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つこのような追加の手順は、ファイルAPIにうまく適合しないため、ネットワークが独自のAPIを持っている主な理由です。

通常、Linuxの/devにエントリがない(ただし、他の一部のUNIXバリアントにはある)デバイスの別のクラスは、ビデオアダプターです。原則として、単純なビデオアダプターは framebuffer デバイスとして公開できます。これは、各ピクセルの色を表すブロックで構成されるブロックデバイスです。高速ビデオアダプタは、アプリケーションがコマンドを送信するキャラクタデバイスとして表すことができます。ここで、デバイスインターフェースの欠点は、低速であることです。表示アプリケーション(実際には、Xサーバー)は、何かを表示するたびにカーネル呼び出しを行う必要があります。代わりに何が起こるかというと、Xサーバーは高速であるため、ほとんどがビデオアダプターのメモリに直接書き込みます。

/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
12
chaoqun lu

AT&T/SolarisのTCP/IPネットワーキングを行う「トランスポートレベルインターフェース」(TLI)の方法には、「/ dev/tcp」や「/ dev/udp」などの特別なファイルがあります。プログラマはその特別なファイルを開いて、適切なプロトコルファミリのソケットを取得します。 Solarisでソケットを使用するプログラムをコンパイルするときに「-lnsl」を指定する必要があるのはそのためです。その下にはTLIがあります。

9
Bruce Ediger

従来、Linuxは完全にposix互換ではありませんでしたが、(LSB以外の)いかなる種類のOpen Group標準にも従いません。より多くのUNIX機能をLinuxに移植する試みがありました。

Glendixは、Plan9の/ net仮想ファイルシステムのポートを提供するプロジェクトの1つであり、説明どおりに実行できます。

Plan9 Port/net filesystem to linux

3
Dwight Spencer