実際のタスク:Linuxでプロセスツリーを復元する方法

私たちはCRIUプロジェクト(ユーザー空間のチェックポイント/復元)を開発しており、元のプロセスツリーを復元する方法についてかなり興味深いタスクがありました。 解決してみることをお勧めします。



挑戦する



CRIUは、プロセスの状態をディスクに保存し、後でこのマシンまたは他のマシンで解決できるユーティリティです。 回復サブタスクの1つは、プロセスツリーを復元するための一連のアクションを見つけることです。 入力には、各プロセスのパラメーターのセット(一意の識別子(PID)、親へのリンク(PPID)、およびセッション識別子(SID))が含まれます。



画像





Linuxがライブで処理するルール







チーム:







サンプル入力



入力データには、各プロセスの行が含まれています。 各行には、pid、ppid(親のpid)、sid、ゾンビフラグの3つの数値が含まれます。値は0(プロセスが停止している場合(「ゾンビ」)、1-プロセスが実行中の場合)です。



1 0 1 1

6 1 6 1

8 6 7 1

15 6 12 1

10 1 10 1

11 10 7 1

13 10 12 1



サンプル出力



1:フォーク(6)

6:フォーク(7)

7:setsid()

7:クローン(8、CLONE_PARENT)

7:終了()

6:待機()

8:フォーク(9)

9:フォーク(10)

10:フォーク(11)

10:フォーク(12)

12:setsid()

12:クローン(13、CLONE_PARENT)

12:クローン(14、CLONE_PARENT)

12:終了()

10:待機(12)

14:フォーク(15)

6:prctl(PR_SET_CHILD_SUBREAPER、1)

14:終了()

10:待機(14)

6:prctl(PR_SET_CHILD_SUBREAPER、0)

9:終了()

8:待機(9)

6:setsid()

10:setsid()



All Articles