「すべてがファイルである」がUnixオペレーティングシステムに特有なのはなぜですか?


70

私はよく「Unixのユニークな哲学は、すべてをファイルとして扱う」または「Unixではすべてがファイルである」と言うことをよく耳にします。しかし、それがなぜUnixに特有なのかを誰も説明するのを聞いたことがありません。

それでは、なぜこれがUnixに特有なのでしょうか?WindowsやMacなどの他のオペレーティングシステムはファイルで動作しませんか?

また、他のオペレーティングシステムと比較してユニークですか?


26
サイドノート:macosxはUNIX上で実行されます。
アキラ

2
fwiw、高レベルのものはファイルを使用しませんが(* nixのdbusまたはXと同様)、低レベルのWindowsはハンドルを中心に構築されます。* nixでファイルを開く(開く、閉じる、制御する、通常は送信/受信する)ことができるのと同じことができますが、そのインターフェイスを見るにはプログラマーである必要があります。それが良いことかどうかは好みの問題です。
マーク

1
ネットワークインターフェイスを除くすべてはファイルです。
アルビン

8
@akira-OSXはUnixの認定を受けており、「トップ」で動作しません。
ロブ

1
@akira Unix上ではありません。OSXは、認定された数少ないUNIX OSの1つです。
Let_Me_Be

回答:


53

それでは、なぜこれがUnixに特有なのでしょうか?

Unix以前の典型的なオペレーティングシステムは、ファイルを一方向で処理し、各周辺デバイスをそのデバイスの特性に従って処理していました。つまり、プログラムの出力がディスク上のファイルに書き込まれた場合、それが出力の唯一の場所でした。プリンターまたはテープドライブに送信できませんでした。各プログラムは、入力と出力に使用される各デバイスを認識し、代替I / Oデバイスを処理するコマンドオプションを備えている必要がありました。

Unixはすべてのデバイスをファイルとして扱いますが、特別な属性があります。プログラムを簡素化するために、標準入力および標準出力は、プログラムのデフォルトの入力および出力デバイスです。そのため、通常コンソール画面向けのプログラム出力は、ディスクファイル、プリンタ、シリアルポートなど、どこにでも送信できます。これはI / Oリダイレクトと呼ばます。

WindowsやMacなどの他のオペレーティングシステムはファイルで動作しませんか?

もちろん、最新のすべてのOSはさまざまなファイルシステムをサポートし、「ファイルを操作」できますが、違いはデバイスの処理方法です。Macについては知りませんが、WindowsはI / Oリダイレクトを提供します。

また、他のどのオペレーティングシステムと比べてユニークですか?

実際にはもうありません。Linuxにも同じ機能があります。もちろん、OSがI / Oリダイレクトを採用する場合、他のUnix機能を使用する傾向があり、最終的にはUnixライクになります。


29
OS Xは基本的にUnixなので、大きな違いはありません。
slhck

6
ファイルモデルのすべてにもう少しがあります。
artistoex

1
冒頭の段落は単に真実ではありません。Unixの前にオペレーティングシステムがあり、I / Oリダイレクトなど、後でUnixで見つかった機能がありました。
パトリックシーモア

3
プラン9は、すべてがファイルの概念であり、さらには「多くのUNIXその後、UNIX」と呼ばれてきた同じ概念を持っている
ウィリアム

2
Windows(NT以降)は少し先に進みます。シリアルポートや名前付きパイプなど、ファイルのように動作するデバイスがたくさんあります。を使用してすべてに書き込むことができますWriteFile。しかし、さらに、ファイルだけでなくミューテックスも含む「同期オブジェクト」のさらに大きなカテゴリがあります。
MSalters

34

「すべてがファイルである」という考えは、Multicsから生まれました。Unixの設計者は、多くの仕事を前任者、特にMulticsに基づいていました。実際、コンピューティングの多くのことは前任者に基づいています。

Unixの設計におけるデニス・リッチーの晩年の研究をもっと読むことができます。彼は、ツリーのようなファイルシステム、コマンドシェル、ファイルの非構造化など、Multicsから「コピー」されたものを参照しました。Unixの人々がMulticsの人々から盗んだことを暗示しているわけではありません。すべての意図と目的のために、それは同じ人々でした。


6
これは最高の回答ではなく、質問に答えず、単に人々に別の質問をするように頼みます。
ライライアン

13
@LieRyan:実際には、なぜそれがユニークなのかという質問に答えます。そうではありません。
ゴランジョヴィック

1
Unixの人々は、Multicsプロジェクトが廃止され、名前が変更されたときに、彼らのアイデアを取り入れました。Unixは単なる言葉遊びです-1対多く。
Fiasco Labs

2
@Lie Ryan-問題は、なぜすべてがファイルなのかということではなく、それがユニークな理由です。ゴランと私が指摘したように、そうではありません。
パトリックシーモア

1
質問は本当に「Unixオペレーティングシステムを指しsの家族すなわち、」。そのファミリには、MulticsとLinuxが合理的に含まれています。
MSalters

28

ユニークですか?いいえ。定義していますか?絶対に。

すべてをファイルまたは既知の階層のデバイスとして持つことは、すべてに同じツールセットを使用できることを意味します。Bell LabsのPlan 9は、ファイルとしてハードウェアデバイスを使用してもこれをさらに進めます。

さらに重要なことは、これにより2つの非常にシンプルで強力な概念が可能になることです。One Thing Well(tm)を実行する基本ユーティリティ。必要に応じてパイプでつなぐことができます。テキストファイルで何かを見つけたいですか?を使用catして表示し、通過させgrep、ガスで調理します。これが、「Unix」方式の真の力です。特殊なアプリケーションが連携して非常に大きな柔軟性を実現します。

Mac OS Xはまた、Unixの哲学に従うが、隠された方が良いでしょう(「アプリケーション」バンドルが本当にファイルの完全なディレクトリである)、そして実際にはUnixの認定を受け、適切である、の子孫のNeXTのビット使用し、FreeBSDの

Windowsには、イベントビューアやレジストリなどのバイナリコンポーネントがいくつかあります。その特定のシナリオでは、速度上の利点がいくつかあります。


1
さらに、プラン9に言及するための1。IMHOFuseは、アドホックおよび反復を通じてプラン9を実装に近づけます。
ダニーステープル

2
さて、プラン9はプラン9であり、それはすでに機能しています。Fuseは、ユーザー空間のファイルシステムの拡張を可能にします。興味深い方法です。IRCがFSとして扱われるものが好きです。
ジャーニーマンオタク

うーん、そうですね、何年も前にエリック・レイモンドの本を読んでからずっと昔から調べようと思っていました。 ISOを試してみてください。
ダニーステープル

2
私は地獄と呼ばれる、新しいバージョンがあまりにもあります信じている
ジャーニーマンオタク

1
OS XのDarwinも「本物のUnix」であることに注意してください。
calum_b

18

特殊ファイルのため。「すべてがUnixのファイルである」と人々が言うとき、一般的なファイルとディレクトリは彼らが念頭に置いているものではありません。特殊ファイルはUnixライクなOSに固有のもので、その多くがあります。したがって Unixに固有のものではありません。

特殊ファイルには多くの目的があります。たとえば、パイプ、ソケット、そして最も注目すべきはデバイスファイルです。パイプとソケットは、プロセス間の通信ストリームです。サブシステムの機能の多くは、デバイスファイルを介してユーザー空間で利用できます。

パイプとソケット

プログラムは、通常のファイルを使用するのと同じようにそれらを使用します。実際、ほとんどの場合、使用するファイルの種類を気にしません。そのため、Unixコマンドを非常に多様に組み合わせて強力な新しいシステムを形成できます。(おがくずの答えのI / Oリダイレクトを参照)

デバイスファイル

前述のように、これらはユーザー空間のインターフェイスのように機能します。たとえば、CDトレイを取り出すために、プログラマは最初に対応するデバイスファイルを開きます。別の例:プログラムで仮想端末を切り替えたい場合。最初に/ dev / consoleを開きます。

次に何が起こるかは単なる文字を送信していないそれらのファイルが、発行)(のioctl上の彼ら。発行できる個々のioctlは、デバイスによって異なります。たとえば、コンソールはconsole_ioctl(4)に文書化されています


12

私はおそらくこれを言ったことで名声を得ようとしていますが、すべてがUnixのファイルであると言うのは実際には誤りです。それは本当に2つのことです。

  1. ファイルとデバイス(および他の多くのもの)は、オープン、クローズ、読み取り、書き込み、および制御(ioctl)機能で構成されるインターフェースによってモデル化できるオブジェクトです。
  2. これらのオブジェクトの名前空間は階層的です。つまり、これらのオブジェクトは階層構造になっています。

ファイルシステムはこの名前空間を実装し、これらのオブジェクトへのインターフェイス関数のディスパッチを可能にするフレームワークを実装します。ファイルシステムは、最初にファイルを格納するために概念化されましたが、その後、ネームスペース階層内の他のオブジェクトを整理するために採用されました。オブジェクト指向以前のポリモーフィズムの例は、ものでした。

すべてのファイルを呼び出すだけで害はありません。しかし実際には、これらはより一般的なオブジェクトです(ファイルはそのようなオブジェクトの1つです)。この観点から見ると、この考えはUnixに固有のものではありません。他の多くのOSは、このようなポリモーフィックオブジェクトの階層を実装しています。


まさに!Unixでは、すべてがファイル記述子(必ずしもファイルではありません!)です。つまり、すべて(メモリを除く)はI / O、さらにはファイルです。ファイルはI / Oストリームであるかのようにアクセスする必要があります(ただし、シーク可能であるため、ランダムにアクセスできますが、余分なシステムコールの極端なコストがかかります)。(mmap()もちろん、できることはほとんどありません。...)
グレッグA.ウッズ

9

人々が「Unixでは、すべてがファイルである」と言うとき、彼らが意味するのは、ファイルではないものもファイルとして扱われるということです。

もちろん、ほとんどのオペレーティングシステムはファイルを処理します。テキストファイル、画像ファイル、音声ファイル。ただし、すべてのオペレーティングシステムがデバイスをファイルとして扱うわけではありません。それは重要な違いです。Ubuntuオペレーティングシステム(Unixベース)の/ dev /フォルダーのコンテンツを一覧表示すると、200を超えるデバイスの一覧が表示されます。これらのデバイスの一部はハードウェアですが、フォルダー内に表示されます。たとえば、ハードドライブ、USBポート、マウスとキーボード、オーディオデバイスとプリンターなどです。一部のデバイスは仮想です。たとえば、/ dev / urandomは、乱数でいっぱいの無限ファイルとして動作します。それは私のハードドライブ上の実際のファイルではありません。

これらのデバイスはすべてファイルとして扱われます。これらのデバイスからデータを読み取ったり、それらのデバイスにデータを書き込んだりできます。ここに、異なるデバイスからオーディオデバイスにデータをコピーするあります。ファイルとして扱われるため、これが可能です。(マニアックな)結果は、ハードドライブのコンテンツ、マウスの動き、コンピューターのメモリ、または画像のピクセルを聞く能力です。デバイスがファイルとして処理されない場合、これは達成するのがはるかに困難です。これは、各デバイスがデータの読み取りと書き込みに異なる方法を必要とするためです。

そうは言っても、「すべて」の意味はシステムによって異なります。たとえば、OS XはUnixベースですが、/ dev / audioデバイスはありません。CoreAudioと呼ばれる独自のオーディオシステムを使用します。したがって、この場合、「ほとんどすべてがファイルです」と言うかもしれません。次に、「すべてがファイルではない」Windowsなどのシステムでは、ファイルの内容をプリンターポートにコピーするなどの操作を行うことができます(たとえば、次のように入力しますcopy mydocument.txt >lpt1:)。システム。

WindowsやOS Xなどの他のオペレーティングシステムはファイルで動作しませんか?はい、彼らがやります。WindowsとOS Xはファイルを操作しますが、Windowsはデバイスをファイルとして扱いません。これは「すべてがファイル」の意味の一部です。


8

Multicsは「すべてがファイル」のソースとして引用されているように見えますが、デバイスファイル、名前付きパイプ、通常のファイルなどよりも少し深く見る必要があると思います。ファイルの命名構文を調べる必要があります。これは、AUX、CON、LPの「マジックファイル名」が存在する場合でも大きな違いをもたらします。

Rob Pikeによる「The Hideous Name」を参照してください。Unixファイル名の構文と、他のいくつかの構文、特にVMSを比較します。Unixが生まれた60年代後半/ 70年代前半のメインフレームOSには、現代の人が非常にロココ様式のファイル命名構文を考慮するものがあったことに注意してください。VM / CMS、またはNOSまたはNOS / VEを使用してから何年も経ち、Univac OSを使用している人の肩越しにだけ見てきましたが、癖が規則性を上回っていると言えば十分です。

Multicsが実行されるのを見たことがありませんが、そのファイルシステムに関する論文を見ることができます。オリジナルのUnixはMulticsがやったよりも「すべてはファイル」であるように見えましたが、あなたの走行距離は異なるかもしれません。


1
まあ、Multicsでは、I / Oを除くすべてがメモリです(ただし、メモリにもマップできます)。Unixでは、すべて(メモリを除く)はファイルを含むファイル記述子です。すなわち、UnixではすべてがI / Oです。
グレッグA.ウッズ

1
ところで、Multicsを起動して実行するエミュレーターが存在します。
グレッグA.ウッズ

3

Linus Torvaldsでさえ、「すべてがファイルである」ことに同意しないことに注意してください。「を検索する場合

すべてがバイトストリームです

「すべてがファイルではなく、たとえばメモリ内の抽象的なデータ構造またはポインターが確実にファイルではないことを意味する興味深い哲学を見つけることができます。もちろん、何でもファイルとして表現できますが、表現と存在は2つの異なるアクションです。


1
リンクを提供しませんでした。いくつかの検索で、yarchive.net / comp / linux / everything_is_file.htmlを見つけました。メールスレッドでTorvaldの応答を引用しており、モデルは「すべてがファイル」であることを暗黙のうちに確認しています。
bgvaughan

1
実際には@bgvaughanは逆です:yarchive.net/comp/linux/everything_is_file.htmlが引用を与えますThe UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
リトルエンシェントフォレストカミ

1
@LIttleAncientForestKami:およびUnixは、ファイルをレコードのストリームとして(またはバイトのストリームとレコードのストリームの両方を持っていた)、ストリームのコレクション(またはリソースフォーク)として、またはより複雑なモデル。いくつかの異なる種類のオブジェクトにアクセスするいくつかの異なる方法がありました。
ninjalj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.