systemdにはmanager_get_unit_by_pid
というユーティリティ関数がある。これはPIDからマネージャ(systemdのデーモンプロセス)のUnit(に対応するデータ構造)を得るための関数だが、この実装方法が少し変わっている。
単純にPIDをキーUnitをバリューとするハッシュデータ構造を持っていても良さそうだが、そうはなっていない。systemdではcgroupのパスをキーとするハッシュを使っている。PIDからcgroupのパスを取得し、それをキーにUnitを取得している。
コードは大体こんな感じ。
src/core/cgroup.c
Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
_cleanup_free_ char *cgroup = NULL;
int r;
r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup);
return manager_get_unit_by_cgroup(m, cgroup);
}
Unit* manager_get_unit_by_cgroup(Manager *m, const char *cgroup) {
char *p;
Unit *u;
u = hashmap_get(m->cgroup_unit, cgroup);
if (u)
return u;
}
cg_pid_get_path
は、/proc/pid/cgroupからname=systemd
という名前のコントローラのエントリを見つけ出し、そのパスを得るというもの。
name=systemd
のコントローラはこんな形で使われているらしい。