From: Franck Bui Date: Mon, 18 Mar 2019 10:48:34 +0000 (+0100) Subject: process-util: introduce pid_is_my_child() helper X-Git-Tag: v242-rc1~102^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4d05154600f64e9d5c9800ff9f61167fe80a08ba;p=thirdparty%2Fsystemd.git process-util: introduce pid_is_my_child() helper No functional changes. --- diff --git a/src/basic/process-util.c b/src/basic/process-util.c index c41a2aa5c9f..98ab8b005cb 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -934,6 +934,20 @@ int getenv_for_pid(pid_t pid, const char *field, char **ret) { return 0; } +int pid_is_my_child(pid_t pid) { + pid_t ppid; + int r; + + if (pid <= 1) + return false; + + r = get_process_ppid(pid, &ppid); + if (r < 0) + return r; + + return ppid == getpid_cached(); +} + bool pid_is_unwaited(pid_t pid) { /* Checks whether a PID is still valid at all, including a zombie */ diff --git a/src/basic/process-util.h b/src/basic/process-util.h index 9950723996f..1571f1a6529 100644 --- a/src/basic/process-util.h +++ b/src/basic/process-util.h @@ -69,6 +69,7 @@ int getenv_for_pid(pid_t pid, const char *field, char **_value); bool pid_is_alive(pid_t pid); bool pid_is_unwaited(pid_t pid); +int pid_is_my_child(pid_t pid); int pid_from_same_root_fs(pid_t pid); bool is_main_thread(void); diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 059bf29eb9c..8db044befa1 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -2269,7 +2269,7 @@ void unit_prune_cgroup(Unit *u) { int unit_search_main_pid(Unit *u, pid_t *ret) { _cleanup_fclose_ FILE *f = NULL; - pid_t pid = 0, npid, mypid; + pid_t pid = 0, npid; int r; assert(u); @@ -2282,15 +2282,12 @@ int unit_search_main_pid(Unit *u, pid_t *ret) { if (r < 0) return r; - mypid = getpid_cached(); while (cg_read_pid(f, &npid) > 0) { - pid_t ppid; if (npid == pid) continue; - /* Ignore processes that aren't our kids */ - if (get_process_ppid(npid, &ppid) >= 0 && ppid != mypid) + if (pid_is_my_child(npid) == 0) continue; if (pid != 0) diff --git a/src/core/service.c b/src/core/service.c index bbe55322099..4682e86f8ee 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -143,8 +143,6 @@ static void service_unwatch_pid_file(Service *s) { } static int service_set_main_pid(Service *s, pid_t pid) { - pid_t ppid; - assert(s); if (pid <= 1) @@ -163,12 +161,10 @@ static int service_set_main_pid(Service *s, pid_t pid) { s->main_pid = pid; s->main_pid_known = true; + s->main_pid_alien = pid_is_my_child(pid) == 0; - if (get_process_ppid(pid, &ppid) >= 0 && ppid != getpid_cached()) { + if (s->main_pid_alien) log_unit_warning(UNIT(s), "Supervising process "PID_FMT" which is not our child. We'll most likely not notice when it exits.", pid); - s->main_pid_alien = true; - } else - s->main_pid_alien = false; return 0; }