1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 10:38:11 +00:00

Shell: Handle SIGCHLD after sending SIGCONT to job

This fixes `fg` and `bg` causing the shell to go into an infinite loop
of trying to `waitpid` until some current job changes state.

a.k.a. "Fix Shell backgrounding, yet again!" :P
This commit is contained in:
AnotherTest 2021-03-30 02:19:02 +04:30 committed by Andreas Kling
parent 50f5959996
commit 5d19509616
3 changed files with 12 additions and 3 deletions

View file

@ -1057,7 +1057,7 @@ void Shell::block_on_job(RefPtr<Job> job)
if (!job)
return;
if (job->is_suspended())
if (job->is_suspended() && !job->shell_did_continue())
return; // We cannot wait for a suspended job.
ScopeGuard io_restorer { [&]() {
@ -1655,6 +1655,12 @@ void Shell::notify_child_event()
}
if (child_pid == 0) {
// If the child existed, but wasn't dead.
if (job.is_suspended() && job.shell_did_continue()) {
// The job was suspended, and we sent it a SIGCONT.
job.set_is_suspended(false);
job.set_shell_did_continue(false);
found_child = true;
}
continue;
}
if (child_pid == job.pid()) {