GNU/Linux >> Linux の 問題 >  >> Linux

プロセスの子を取得する際に、兄弟リストを使用して task_struct を取得する理由

struct list_head を使用してリンクされたリストとしてデータを整理するには リスト ルートを宣言する必要があります リスト エントリを宣言します リンケージ用。ルート エントリと子エントリの両方が同じ型 (struct list_head )。 children struct task_struct のエントリ エントリは root です . sibling struct task_struct のエントリ list entry です .違いを確認するには、コードを読む必要があります。ここで childrensibling 使用されています。 list_for_each の使い方 children の場合 children の意味 root です . list_entry の使い方 sibling の場合 sibling の意味 list entry です .

Linux カーネル リストの詳細については、こちらをご覧ください。

質問 :ここで「兄弟」を渡し、最終的に異なるオフセットを持つ別のリストを渡す理由は何ですか?

答え:

リストがこのように作成された場合:

list_add(&subtask->sibling, &current->children);

より

list_for_each(list, &current->children)

リストポインタを sibling に初期化します 、したがって、 subling を使用する必要があります list_entry へのパラメーターとして。それが方法 Linux カーネルは設計された API をリストします。

しかし、リストが別の場所で作成された場合 (間違い) ) 方法:

list_add(&subtask->children, &current->sibling);

これをリストを反復する必要があるよりも (間違った ) 方法:

list_for_each(list, &current->sibling)

children を使用する必要があります list_entry のパラメータとして .

これが役に立てば幸いです。


以下は、将来誰かを助けるかもしれない絵の表現です.上のボックスは親を表し、下の 2 つのボックスはその子を表します


前の回答に追加した図を次に示します。同じプロセスが親と子の両方になる可能性があり (図の Parent1 のように)、これら 2 つの役割を区別する必要があります。

直感的に、children の場合 Parent0 の children を指します Parent1、次に Parent0.children.next->next Parent1.children.next と同じです (図の緑色の円)。 、Parent0 の次の子ではなく、Parent1 の子を指します。


Linux
  1. `ifs=の代わりに`whileIfs=Read`が頻繁に使用されるのはなぜですか。読みながら..`?

  2. Grep – GrepパターンのブラケットがPs結果からGrepプロセスを削除するのはなぜですか?

  3. 子プロセスのPgidが親のPidではないのはなぜですか?

  1. Linux – Linux Utilsが現在の時刻を取得するためにシステムコールを使用しないのはなぜですか?

  2. ファイル/フォルダのリストを時間でソートするために使用されるコマンドはどれですか?

  3. 長時間実行されている Linux プロセスの開始時刻を取得するには?

  1. Golang Web サーバーをバックグラウンドで実行するにはどうすればよいですか?

  2. nohupプロセスを強制終了するプロセスIDを取得するには?

  3. 実行中のプロセスのウォールクロック時間を取得するにはどうすればよいですか?