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


70

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


2
私は、マントラにもかかわらず、Unixのすべてがファイルではないことについて少なくとも1つの記事/暴言を見てきましたが、この問題を引用しています。今は見つけられませんが、おそらくPlan 9またはGNU Hurdに関する記事でした。
ショーンJ.ゴフ

3
少なくともSolarisでは、/ dev(実際には/ devices)の下にネットワークインターフェイスデバイスがあります。
jlliagre

2
Unixのすべてがファイルであることは、ユーザーランド全体に対して必ずしもそのように動作することを意味するわけではなく、基礎となるAPIがファイル記述子に対して正常かつ均一に動作するということだけです。あなたはソケットを開くと、たとえば、あなたが使用することができますread()し、write()そのファイルの場合と同じように、しかし、ユーティリティ関数recv()send()あなたのためのより多くの取材を行います。
-jgoldschrafe

1
それは私が何年も自問していた質問でした。尋ねてくれて、人々が答えてくれてありがとう!
ドラノール

回答:


43

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

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

ネットワークインターフェイスはより複雑です。読み取りと書き込みはバイトではなくパケットです。readwriteで通常のインターフェースを使用することは依然として可能ですが、厄介です:おそらく各呼び出し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がある主な理由です。

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


2
実際、高速化されたビデオアダプター、LinuxのDRIを介してchardevsとしてエクスポートされます。ファイルI / O操作をしているではないneccessarily read/ writeどちらか。mmapマップされたファイルとデバイスメモリへの直接アクセスに使用できます。
minmaxavg

11

/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

U&Lへようこそ。特に<>マークアップとして解釈される別の方法で使用する場合は、インラインコードの周りで常に逆引用符を使用します。(名前を変更してASCII文字表記で開始することもできます。単純なキーボードを使用している人は、コメントに応答して名前の最初の文字を入力するのが難しいためです)
Anthon

9

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


4
Linuxには/dev/tcpともあり/dev/udpますが、ほとんどのカーネルでは無効になっています。
バハマ

3

従来のLinuxは完全にposix互換ではありませんでしたが、あらゆる種類のOpen Group標準(LSB以外の場合もあります)に準拠することは言うまでもありません。より多くのUNIX機能をLinuxに移植する試みがありました。

Glendixはそのようなプロジェクトの1つであり、Plan9の/ net仮想ファイルシステムのポートを提供します。これにより、説明どおりに行うことができます。

LinuxへのPlan9 Port / netファイルシステム

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.