Skip to content

Commit

Permalink
src: fix kill signal on Windows
Browse files Browse the repository at this point in the history
Fixes: nodejs#42923
PR-URL: nodejs#55514
Reviewed-By: Luigi Pinca <[email protected]>
Reviewed-By: Stefan Stojanovic <[email protected]>
  • Loading branch information
huseyinacacak-janea authored and tpoisseau committed Nov 21, 2024
1 parent 3814652 commit e853045
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
4 changes: 2 additions & 2 deletions doc/api/child_process.md
Original file line number Diff line number Diff line change
Expand Up @@ -1700,8 +1700,8 @@ may not actually terminate the process.
See kill(2) for reference.
On Windows, where POSIX signals do not exist, the `signal` argument will be
ignored, and the process will be killed forcefully and abruptly (similar to
`'SIGKILL'`).
ignored except for `'SIGKILL'`, `'SIGTERM'`, `'SIGINT'` and `'SIGQUIT'`, and the
process will always be killed forcefully and abruptly (similar to `'SIGKILL'`).
See [Signal Events][] for more details.
On Linux, child processes of child processes will not be terminated
Expand Down
6 changes: 6 additions & 0 deletions src/process_wrap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,12 @@ class ProcessWrap : public HandleWrap {
ProcessWrap* wrap;
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This());
int signal = args[0]->Int32Value(env->context()).FromJust();
#ifdef _WIN32
if (signal != SIGKILL && signal != SIGTERM && signal != SIGINT &&
signal != SIGQUIT) {
signal = SIGKILL;
}
#endif
int err = uv_process_kill(&wrap->process_, signal);
args.GetReturnValue().Set(err);
}
Expand Down
19 changes: 19 additions & 0 deletions test/parallel/test-child-process-kill.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,22 @@ assert.strictEqual(cat.signalCode, null);
assert.strictEqual(cat.killed, false);
cat.kill();
assert.strictEqual(cat.killed, true);

// Test different types of kill signals on Windows.
if (common.isWindows) {
for (const sendSignal of ['SIGTERM', 'SIGKILL', 'SIGQUIT', 'SIGINT']) {
const process = spawn('cmd');
process.on('exit', (code, signal) => {
assert.strictEqual(code, null);
assert.strictEqual(signal, sendSignal);
});
process.kill(sendSignal);
}

const process = spawn('cmd');
process.on('exit', (code, signal) => {
assert.strictEqual(code, null);
assert.strictEqual(signal, 'SIGKILL');
});
process.kill('SIGHUP');
}

0 comments on commit e853045

Please sign in to comment.