もっと詳しく
C 言語は、さまざまなテクノロジや API の使用に関して非常に広大な言語です。 ソケットプログラミングを使用したい場合にも非常に便利です。 このように、epoll 7 の関数が表示されます。 Poll(2) と epoll API は両方とも、さまざまなドキュメント記述子を観察して、それらのすべてで I/O が実行可能かどうかを判断します。 epoll API は、監視対象の多数のドキュメント記述子に非常によく対応しており、レベル プロンプトまたはエッジ プロンプト ゲートウェイとして使用できます。

ユーザー空間からは 2 つのセットのラッパーとして見えるカーネル内情報モデルである epoll エンティティは、epoll API の基本的な考え方として機能します。 このガイドでは、C 言語での epoll 関数の使用について説明します。

  • 興味のあるリスト: epoll コレクションとも呼ばれるインタレスト グループは、追跡することに関心があることをプロシージャが示したドキュメント記述子のコレクションです。 I/O の「準備ができている」と思われるドキュメント記述子の集まりは、オールセット キューと呼ばれます。
  • レディリスト: I/O 用に「準備」されたドキュメント ID のコレクションは、「準備完了リスト」と呼ばれます。 対象リスト内のドキュメント識別子は、準備完了リストのサブグループ (または、より正確には、ポインタのコレクション) です。 カーネルは、そのようなドキュメント記述子で I/O 操作を使用して、準備完了リストを定期的に埋めます。

次のシステム関数は、epoll オブジェクトを構築および管理するために使用できます。

  • Epoll_create(2): epoll create(2) 関数は、epoll サービスの新しいインスタンスを開始し、ファイル記述子を返します。 (より現代的な epoll create1 (2) は epoll create (2) (機能) を拡張したものです)。
  • Epoll_ctl(2): epoll オブジェクトの対象リストに情報を提供し、特定のドキュメント記述子に対象を登録するために使用されます。
  • Epoll_wait(2): 現時点で I/O アクティビティが存在しない場合、epoll wait(2) はそれを呼び出したスレッドをブロックします。 (このシステム コールは、epoll オブジェクトの準備完了リストから何かを収集していると見なすことができます。)

レベルトリガーとエッジトリガー

エッジ トリガー (ET) とレベル トリガー (LT) の両方の動作が、epoll インシデント サーキュレーション インターフェイス (LT) で可能です。 2 つの方法の違いは、次のように要約できます。 次のことが発生するとします。

  1. パイプのドキュメント記述子 (RFD) の読み取り側は、epoll オブジェクトに登録されます。
  2. パイプ作成者によってコンテナーのライティング ウォールに合計 2 KB のコンテンツが書き込まれています。
  3. epoll wait(2) への要求が行われ、準備されたファイル ハンドルである RFD が返されます。
  4. RFD から、パイプライン リーダーは 1 キロバイトのコンテンツを読み取ります。
  5. epoll_wait(2) 関数呼び出しが行われます。

手順 5 で作成された epoll_wait(2) への要求は、RFD ドキュメント ハンドルが EPOLLET (エッジ トリガー) シグナルで epoll プロトコルに割り当てられている場合、停止する可能性があります。 その間、リモート パートナーは、既に提供したコンテンツに応じて、反応を予期している可能性があります。 これは、エッジ トリガー オプションは、観察されたドキュメント記述子が変更されるたびにシグナルのみを送信するためです。

したがって、呼び出し元関数は、フェーズ 5 で既にバッファー キャッシュにある特定の情報を保留する必要がある場合もあります。インシデントは 3 で受信されます。手順 4 の読み取りアクティビティがすべてのバッファ情報を使用しなかったため、手順 5 の epoll_wait(2) の呼び出しがスタックする可能性があります。

読み取りまたは書き込みの停止によって、さまざまなファイル記述子を管理しているジョブが使い果たされるのを防ぐために、EPOLLET オプションを使用するプログラムは、ノンブロッキング ドキュメント記述子を使用する必要があります。 以下は、epoll をエッジ トリガー (EPOLLET) インターフェイスとして使用するための推奨手順です。

  • ノンブロッキング ドキュメント記述子、および
  • read(2) または write(2) の直後に、アクションを待つことによって EAGAIN を配信します。

一方、Epoll は poll(2) のより高速なバージョンであり、レベル トリガー プロトコル (EPOLLET が与えられていません)。 呼び出し側関数は、epoll_wait でオカレンスを受け取ったときに、リンクされたファイル記述子を閉じるように epoll に指示する EPOLLONESHOT シグナルを提供する選択肢があります。 一方、エッジトリガーの epoll でも、複数の情報を受け取ると多くのアクションを作成できます (2)。 呼び出し元は、EPOLLONESHOT フラグが指定されている場合は常に、epoll_ctl(2) および EPOLL_CTL_MOD を使用してドキュメント記述子を再デプロイする必要があります。

例:

しきい値 API として使用される場合の epoll のロジックは、poll(2) のロジックと同じですが、エッジ トリガー動作は、プログラム イベント キューの遅延を防ぐために、より詳細な説明の呼び出しを使用します。 この図のリスナーは、listen(2) 関数が呼び出されるノンブロッキング ソケットです。 EAGAIN が read(2) または write() 関数によって与えられる前に、メソッドは fd() 関数を使用して、新しい準備完了ファイル記述子を維持します (2)。 イベント ドリブン ステート マシン アプリは、EAGAIN を受け取った後に現在の状態を保存して、fd() が再度呼び出されたときに前の時点で読み取りまたは書き込みを再開できるようにすることもできます。 ここに添付されたコードをチェックしてください:

効率を改善するために、(EPOLLIN|EPOLLOUT) をエッジ トリガー インターフェイスとして指定することにより、ファイル記述子を epoll インターフェイス (EPOLL CTL ADD) 内で 1 回だけ追加することができます。 EPOLL CTL MOD を使用して epoll ctl (2) を実行すると、EPOLLIN と EPOLLOUT の間で常にシフトすることを回避できます。 この図の残りのコードは、次の図に追加されています。

結論:

これは、ソケット プログラミングを実行するための Ubuntu 20.04 Linux オペレーティング システムでの epoll 7 C 関数の使用に関するものです。 epoll() 7 C 関数を使用してさまざまなファイル記述子の実現可能性をチェックし、それらに含まれる入力と出力がサーバー側とクライアント側の両方から実行可能かどうかを判断する方法について説明しました。

The post Epoll 7 C 関数 appeared first on Gamingsym Japan.