Unixファイルシステム設計になぜ存在し、存在するのですかopen()
?close()
OSが初めて検出read()
またはwrite()
呼び出されopen()
、通常実行することはできませんか?
答え1
デニス・リッチが言及した«Unix時分割システムの進化»彼open
はclose
最初からread
システムにいました。write
creat
ないシステムは想像できopen
ませんがclose
、デザインが複雑になると思います。特に、非常に限られた RAM で UNIX が起動された古いコンピュータでは、通常は読み込みと書き込みの呼び出しを一度だけ行うのではなく、複数回呼び出すことを望んでいます。現在のファイルの場所を保持するハンドルがある場合、これは単純化されます。ハンドルを返すには、ハンドルと自己戻り状態のペアを返す必要がありますread
。write
ペアのハンドル部分は他のすべての呼び出しには役に立たないので、この配列を厄介にします。カーソル状態をカーネルに残すことは、単純なバッファリングよりも効率的です。道順に関連するいくつかの費用もあります。ハンドルがあれば、費用を一度だけ支払うことができます。さらに、UNIXの世界観の一部のファイルにはファイルシステムパスさえありません(またはありません。今ではそうです/proc/self/fd
)。
答え2
その後、すべてのread
sumwrite
呼び出しは、各ジョブについて次の情報を渡す必要があります。
- ファイル名
- ファイル権限
- 発信者が追加中か作成中か
- 発信者が誰であるか完璧ファイル処理(未使用の読み取りバッファを削除し、書き込みバッファが実際に書き込みを完了していることを確認)
独立を考慮しても着信電話 open
、read
およびwrite
はclose
単一目的I / Oよりも単純です。情報あなたのデザインコンセプトに応じて。 Unix開発者は、単一のタスク(またはプログラム)ですべてのタスクを実行するのではなく、さまざまな方法で組み合わせることができる簡単なタスクと手順を使用することにしました。
答え3
UNIXのデザイン選択は、ファイルシステムの一部ではない部分を含む「すべてがファイル」であるため、ファイルハンドルの概念が重要です。たとえば、テープドライブ、キーボードとスクリーン(またはテレタイパー!)、パンチカード/テープリーダー、シリアル接続、ネットワーク接続、および「パイプ」と呼ばれる他のプログラムへの(UNIXの主な発明)直接接続などがあります。
など、多くの単純な標準のUNIXユーティリティ、特に元のバージョンを見ると、andへの呼び出しは含まれておらず、andのみがgrep
含まれていることがわかります。ファイルハンドルが設定されました。open()
close()
read
write
外部プログラムはシェルによって実行され、起動時に渡されます。したがって、プログラムはファイルに書き込むか他のプログラムに書き込むかを気にする必要はありません。
open
ファイル記述子を取得する別の方法は、、、、およびパイプを介してsocket
ファイルlisten
記述pipe
子dup
を送信する Heath Robinson メカニズムです。https://stackoverflow.com/questions/28003921/sending-file-descriptor-by-linux-socket
編集する:いくつかの配布資料間接的なレベルと O_APPEND が正しく機能する方法を説明します。 inode データをメモリーに保持すると、次の書き込み操作でシステムがそのデータを再インポートする必要はありません。
答え4
Open() は、使用中のファイルをロックする方法を提供します。オペレーティングシステムが自動的にファイルを開き、ファイルを読み書きした後にファイルを再び閉じると、他のアプリケーションがタスク間でファイルを変更するのを防ぐことはできません。
これは管理できますが(多くのシステムが非排他的なファイルアクセスをサポートしています)、単純化のために、ほとんどのアプリケーションは自分が開くファイルが変更されないと仮定します。