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.
This commit is contained in:
AnotherTest 2020-10-28 09:46:09 +03:30 committed by Andreas Kling
parent a935a31ecf
commit a46318d414
Notes: sideshowbarker 2024-07-19 01:39:56 +09:00

View File

@ -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;
}