ホームページ >運用・保守 >Linuxの運用と保守 >Linuxハンドルとは何ですか
Linux では、ハンドルは識別子、つまりシステムによって管理される参照識別子です。開発者がファイル オブジェクトのハンドルを取得している限り、カーネルはハンドルを使用してカーネル内のファイル オブジェクトのアドレスを計算できます。オブジェクトは、任意の操作を実行できます。
#このチュートリアルの動作環境: linux5.9.8 システム、Dell G3 コンピューター。
ハンドルとは
ハンドルは識別子であり、オブジェクトのハンドルを取得する限り、任意の操作を実行できます。オブジェクト上で。
ハンドルはポインタではありません。オペレーティング システムは、ハンドルを使用してメモリの一部を検索できます。このハンドルは、識別子、マップ キー、またはポインタである可能性があります。それは、オペレーティング システムの処理方法によって異なります。それ。 fd はある程度ハンドルを置き換えるものと考えることができますが、Linux にも対応する機構はありますが、ハンドルの種類は統一されておらず、各種システムリソースはそれぞれの種類で識別され、それぞれのインターフェースで操作されます。
オペレーティング システム レベルでは、ファイル操作にも FILE と同様の概念があり、Linux ではファイル記述子 (File Descriptor) と呼ばれ、Windows ではハンドル (Handle) と呼ばれます。後述)、曖昧な場合は総称してハンドルと呼びます)。ユーザは、ある関数を介してファイルを開き、ハンドルを取得し、その後、ハンドルを介してファイルを操作する。
大まかな説明
windows はハンドル、liunx は fd に似ています。初期の Windows 開発本では、ハンドルは「ハンドル」と翻訳されています。 。音は良くありませんが、表現力はかなりあると個人的には思います。
ハンドルを握るだけですが、ドア全体を引くことができ、ドアの外観を気にする必要はありません
ドアに複数のハンドルがある場合、ドア全体を引くことができます。 (プロセス) 待ってください。ドアがどこに行くかはわかりません。
このようなハンドルを設計した理由は、ハンドルによってユーザーがファイル オブジェクトの読み書きを妨げる可能性があるためです。オペレーティング システム カーネルを自由に操作できます。 Linux であっても Windows であっても、ファイル ハンドルは常にカーネルのファイル オブジェクトに関連付けられますが、関連付けの詳細はユーザーには表示されません。カーネルはハンドルを通じてカーネル内のファイル オブジェクトのアドレスを計算できますが、この機能はユーザーには公開されていません。
liunx での処理
Linux システム設計では、すべてがファイル、つまりディスク ファイルやディレクトリであるという原則に従います。 、ネットワークソケット コネクタ、ディスク、パイプなどはすべてファイルであり、開くとファイルハンドルである fd を返します。
ファイルを頻繁に開いたり、ネットワーク ソケットを開いて解放し忘れたりすると、ハンドルがリークされます。
Linux システムでは、プロセスが呼び出すことができるファイル ハンドルの数に制限があります。デフォルトでは、各プロセスが呼び出すことができるファイル ハンドルの最大数は 1024 です。この制限を超えると、プロセスは新しいファイルを取得できなくなり、その結果、新しいファイルやネットワーク ソケットを開くことができなくなり、オンライン サーバーのサービスが拒否されます。
以下は具体的な例であり、Linux では、値 0、1、2 の fd はそれぞれ標準入力、標準出力、標準エラー出力を表します。プログラム内でファイルを開いて得られる fd は 3 から増え始めます。
fd とは正確には何ですか?
カーネルでは、各プロセスにはプライベートな「オープン ファイル テーブル」があります。このテーブルはポインタの配列であり、各要素はカーネルを指します。ファイルオブジェクト。
そして、fd はこの表の添字です。ユーザーがファイルを開くと、カーネルは内部でオープン ファイル オブジェクトを生成し、このテーブルで空の項目を見つけ、この項目が生成されたオープン ファイル オブジェクトを指すようにし、この項目の添え字を fd として返します。
このテーブルはカーネル内にあり、ユーザーはアクセスできないため、ユーザーが fd を所有していても、開いているファイル オブジェクトのアドレスを取得できず、システムが提供する関数を通じてのみ操作できます。
C 言語において、ファイルを操作するチャネルは FILE 構造です。C 言語の FILE 構造が fd と 1 対 1 の関係にあることは想像に難くありません。各 FILE 構造には、独自の対応FDです。
プログラミングにおいて、ハンドルは特別なスマート ポインターです。アプリケーションが他のシステム (データベースやオペレーティング システムなど) によって管理されているメモリ ブロックやオブジェクトを参照する場合、ハンドルが使用されます。
ハンドルと通常のポインタの違いは、ポインタには参照先オブジェクトのメモリ アドレスが含まれるのに対し、ハンドルはシステムによって管理される参照識別子であり、ハンドルによってメモリ アドレスに再配置できることです。システム。この間接オブジェクト アクセス モードにより、参照されるオブジェクトに対するシステムの制御が強化されます。
1980 年代のオペレーティング システム (Mac OS や Windows など) のメモリ管理では、ハンドルが広く使用されました。 Unix システムのファイル記述子は基本的にハンドルです。他のデスクトップ環境と同様に、Windows API はハンドルを広範囲に使用してシステム内のオブジェクトを識別し、オペレーティング システムとユーザー空間の間の通信チャネルを確立します。たとえば、デスクトップ上のフォームは、HWND タイプのハンドルによって識別されます。
現在、メモリ容量と仮想メモリ アルゴリズムの増加により、より単純なポインタの人気が高まっていますが、別のポインタを指すハンドルは人気がなくなっています。それにもかかわらず、多くのオペレーティング システムは依然としてプライベート オブジェクトへのポインターと、プロセスがハンドルとしてクライアントに渡す内部配列インデックスを参照します。
関連する推奨事項: 「Linux ビデオ チュートリアル 」
以上がLinuxハンドルとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。