From a46318d414a30c3f30517795b8737600bed91486 Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Wed, 28 Oct 2020 09:46:09 +0330 Subject: [PATCH] Shell: Do not bail early when printing jobs if waitpid() fails This fixes running `jobs` in a child process. Also makes sure that stdout is flushed when writing jobs out. --- Shell/Job.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Shell/Job.cpp b/Shell/Job.cpp index 6402a3d5f9c..de662033fb5 100644 --- a/Shell/Job.cpp +++ b/Shell/Job.cpp @@ -37,13 +37,9 @@ bool Job::print_status(PrintStatusMode mode) { int wstatus; auto rc = waitpid(m_pid, &wstatus, WNOHANG); - if (rc == -1) { - perror("waitpid"); - return false; - } auto status = "running"; - if (rc != 0) { + if (rc > 0) { if (WIFEXITED(wstatus)) status = "exited"; @@ -52,6 +48,15 @@ bool Job::print_status(PrintStatusMode mode) if (WIFSIGNALED(wstatus)) status = "signaled"; + } else if (rc < 0) { + // We couldn't waitpid() it, probably because we're not the parent shell. + // just use the old information. + if (exited()) + status = "exited"; + else if (m_is_suspended) + status = "stopped"; + else if (signaled()) + status = "signaled"; } char background_indicator = '-'; @@ -72,6 +77,7 @@ bool Job::print_status(PrintStatusMode mode) outln("[{}] {} {} {} {} {}", m_job_id, background_indicator, m_pid, m_pgid, status, command); break; } + fflush(stdout); return true; }