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:
parent
50f5959996
commit
5d19509616
3 changed files with 12 additions and 3 deletions
|
@ -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()) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue