diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-30 20:02:23 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2025-07-30 20:02:23 +0200 |
| commit | a98b95b715359a8b002d1cb8e1f998a4afa2c73e (patch) | |
| tree | f77e0efb753c16297df47d825ad1d0bf829320ec | |
| parent | 41f677ec5daccaeae616a0bbf508d2a2d54bdac7 (diff) | |
*: use safe_waitpid() or wait_any_nohang() where approppriate
function old new delta
crond_main 1227 1237 +10
init_main 804 794 -10
wait_one 263 252 -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/2 up/down: 10/-21) Total: -11 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | e2fsprogs/fsck.c | 4 | ||||
| -rw-r--r-- | init/init.c | 2 | ||||
| -rw-r--r-- | miscutils/crond.c | 10 |
3 files changed, 9 insertions, 7 deletions
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c index fd4ea737c..f7e93497d 100644 --- a/e2fsprogs/fsck.c +++ b/e2fsprogs/fsck.c @@ -423,13 +423,11 @@ static int wait_one(int flags) /* if (G.noexecute) { already returned -1; } */ while (1) { - pid = waitpid(-1, &status, flags); + pid = safe_waitpid(-1, &status, flags); kill_all_if_got_signal(); if (pid == 0) /* flags == WNOHANG and no children exited */ return -1; if (pid < 0) { - if (errno == EINTR) - continue; if (errno == ECHILD) { /* paranoia */ bb_simple_error_msg("wait: no more children"); return -1; diff --git a/init/init.c b/init/init.c index 797e0a0eb..294be9952 100644 --- a/init/init.c +++ b/init/init.c @@ -1201,7 +1201,7 @@ int init_main(int argc UNUSED_PARAM, char **argv) int status; struct init_action *a; - wpid = waitpid(-1, &status, WNOHANG); + wpid = wait_any_nohang(&status); if (wpid <= 0) break; diff --git a/miscutils/crond.c b/miscutils/crond.c index b29745576..6a384fdfb 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -989,7 +989,7 @@ static int check_completions(void) if (line->cl_pid <= 0) continue; - r = waitpid(line->cl_pid, NULL, WNOHANG); + r = safe_waitpid(line->cl_pid, NULL, WNOHANG); if (r < 0 || r == line->cl_pid) { process_finished_job(file->cf_username, line); if (line->cl_pid == 0) { @@ -1002,8 +1002,12 @@ static int check_completions(void) file->cf_has_running = 1; } - /* Reap any other children we don't actively track */ - while (waitpid(-1, NULL, WNOHANG) > 0); + /* Reap any other children we don't actively track. + * Reportedly, some people run crond as init process! + * Thus, we need to reap orphans, like init does. + */ + while (wait_any_nohang(NULL) > 0) + continue; //FIXME: if !file->cf_has_running && file->deleted: delete it! //otherwise deleted entries will stay forever, right? |
