LoginSignup
2

More than 5 years have passed since last update.

PIDからマネージャのUnitを得る

Posted at

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のコントローラはこんな形で使われているらしい。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2