/******************** * カーネルにおけるリンクリストの応用************************/ (1)はじめに Linux カーネルでは、デバイス リストやさまざまな機能モジュールのデータ構成など、データを整理するために多数のリンク リスト構造が使用されます。これらのリンク リストのほとんどは、include/linux/list.h に実装されている非常に優れたリンク リスト データ構造を使用します。 リンク リスト データ構造の定義は簡単です。 構造体list_head{ 構造体 list_head *次、*前; }; list_head 構造体には、list_head 構造体を指す 2 つのポインター prev と next が含まれます。カーネルのデータ構造は通常、二重循環リンク リストに編成されます。 以前に紹介した二重リンクリスト構造モデルとは異なり、ここでの list_head にはデータ ドメインがありません。 Linux カーネルのリンク リストでは、リンク リスト構造にデータが含まれるのではなく、リンク リスト ノードがデータ構造に含まれます。のように: 構造体my_struct{ 構造体 list_head リスト; 署名なしのロングドッグ; void *cat; }; Linux のリンク リストには固定のヘッダーがなく、どの要素からでもアクセスを開始できます。リンク リストをトラバースするには、ノードから開始し、ポインターに従って次のノードにアクセスし、元のノードに戻るまで続けます。個々のノードはリンク リスト ヘッドと呼ぶことができます。 (2)リンクリストの初期化 a. 静的 コンパイル時にリンク リストを静的に作成し、それを直接参照する場合は、次のようになります。 構造体 my_struct mine={ .lost = LIST_HEAD_INIT(mine.list); .犬 = 0, .cat = NULL }; //またはstatic LIST_HEAD(fox); /* struct list_head fox = LIST_HEAD_INIT(fox); に等しい */ b. ダイナミック 構造体 my_struct *p; p = kmalloc(GFP_KERNEL、sizeof(my_struct)); p->犬 = 0; p->cat = NULL; INIT_LIST_HEAD(&p->リスト); (3)業務一覧 カーネルは、リンク リストを操作するための一連の関数を提供します。 知らせ!これらの関数はすべて、1 つ以上の list_head 構造体ポインターをパラメーターとして受け取ります。 <linux/list.h> で定義されています a. ノードを追加する list_add(構造体list_head *new, 構造体list_head *head); //指定されたリンクリストの先頭ノードの後に新しいノードを挿入します b. リンクリストの末尾にノードを追加する list_add_tail(構造体list_head *new, 構造体list_head *head); //指定されたリンクリストの先頭ノードの前に新しいノードを挿入します c. リンクリストからノードを削除する list_del(構造体list_head *エントリ); // リンクリストからエントリを削除する d. あるリンクリストから別のリンクリストにノードを移動する list_move(構造体list_head *リスト、 構造体list_head *head); リンクリストからリスト項目を削除し、ヘッドの後に挿入する e.list_empty(構造体list_head *head); リンクリストが空の場合は0以外の値を返し、そうでない場合は0を返します。 f. リンクリストをマージする list_splice(構造体list_head *リスト、 構造体list_head *head); //知らせ!新しいリンクリストにはリストノードが含まれません (4)リンクリストの走査 リンクリスト自体は重要ではなく、リンクリストを含む構造にアクセスすることが重要である。 a. リンクリストポインタからリンクリストを含む構造体へのポインタを取得する list_entry(構造体list_head *ptr, 構造体の型、 フィールド名);
のように: my_struct *p = (list_head *ptr、my_struct、リスト); b. リンクリストを走査する list_for_each(構造体list_head *カーソル、 構造体 list_head *リスト); //list_entry と組み合わせて使用されることが多い //注意! list_for_eachで走査する場合、ヘッドノードは含まれません c. トラバース中に大きな構造へのポインタを取得する list_for_each_entry(type *cursor, 構造体 list_head *リスト、 メンバー); d. リンクリストをトラバースしながら、トラバースした各ノードを解放する list_for_each_entry_safe(型 *カーソル、 *tmp; と入力します。 構造体 list_head *リスト、 メンバー); 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
<<: Node.js環境でMySQLデータベースを素早く操作する方法を詳しく説明します
>>: Alibaba Cloud Centos7.3 インストール mysql5.7.18 rpm インストール チュートリアル
目次1. COUNTの初見2. COUNT(フィールド)、COUNT(定数)、COUNT(*)の違い...
目次序文antd はどのようにしてコンポーネントをカプセル化するのでしょうか?ディバイダーコンポーネ...
結合の書き方左結合を使用する場合、左側のテーブルが必ず駆動テーブルになりますか? 2 つのテーブルの...
この記事では、参考までに、シンプルな広告ウィンドウを実装するためのjsの具体的なコードを紹介します。...
MySQL 複数の無関係なテーブルクエリデータとページング機能要件主キーと外部キーの関連付けがない ...
目次序文計算されたプロパティ計算プロパティの紹介入門ケース統計価格事例ゲッターメソッドとセッターメソ...
目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...
場合によっては、MySQL が公式に提供しているテスト ライブラリに基づいてテスト データを作成し、...
HTML、CSS、JSフロントエンドを学習中の皆さん、今回はショッピングモールの事例の実装をシェアし...
この記事では、ローカルストレージの追加、削除、変更を実装するためのVueの具体的なコードを例として紹...
1. 要件の説明特定の要素については、背景background-imageを半透明にしたいが、テキス...
mysql の権限とインデックスmysql の最高権限ユーザーは root です。 CREATE U...
<本文> <div id="ルート"> <h1&...
目次js 呼び出しメソッドアンドロイド1.jsはネイティブを呼び出す2. ネイティブコールjs iO...
コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...