Kernel: Don't send SIGCHLD to parent process if he has SA_NOCLDWAIT set.

Just transfer ownership of the dead process to the colonel and let the
scheduler reap it on next iteration.
This commit is contained in:
Andreas Kling 2019-03-01 15:47:07 +01:00
parent 5f4245789d
commit 274b0260f7
Notes: sideshowbarker 2024-07-19 15:34:26 +09:00
3 changed files with 18 additions and 2 deletions

View File

@ -7,11 +7,22 @@
#include <LibGUI/GMenuBar.h>
#include <LibGUI/GAction.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include "DirectoryTableView.h"
int main(int argc, char** argv)
{
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_flags = SA_NOCLDWAIT;
act.sa_handler = SIG_IGN;
int rc = sigaction(SIGCHLD, &act, nullptr);
if (rc < 0) {
perror("sigaction");
return 1;
}
GApplication app(argc, argv);
auto mkdir_action = GAction::create("New directory...", GraphicsBitmap::load_from_file(GraphicsBitmap::Format::RGBA32, "/res/icons/mkdir16.rgb", { 16, 16 }), [] (const GAction&) {

View File

@ -2202,7 +2202,12 @@ void Process::finalize()
{
InterruptDisabler disabler;
if (auto* parent_process = Process::from_pid(m_ppid)) {
parent_process->send_signal(SIGCHLD, this);
if (parent_process->m_signal_action_data[SIGCHLD].flags & SA_NOCLDWAIT) {
// NOTE: If the parent doesn't care about this process, let it go.
m_ppid = 0;
} else {
parent_process->send_signal(SIGCHLD, this);
}
}
}

View File

@ -138,7 +138,7 @@ bool Scheduler::pick_next()
}
if (process.state() == Process::Dead) {
if (current != &process && !Process::from_pid(process.ppid())) {
if (current != &process && (!process.ppid() || !Process::from_pid(process.ppid()))) {
auto name = process.name();
auto pid = process.pid();
auto exit_status = Process::reap(process);