Skip to content

Commit 4f80d4b

Browse files
huseyinacacak-janeamarco-ippolito
authored andcommitted
src: fix kill signal on Windows
Fixes: #42923 PR-URL: #55514 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Stefan Stojanovic <stefan.stojanovic@janeasystems.com>
1 parent e52cedd commit 4f80d4b

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

doc/api/child_process.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1700,8 +1700,8 @@ may not actually terminate the process.
17001700
See kill(2) for reference.
17011701
17021702
On Windows, where POSIX signals do not exist, the `signal` argument will be
1703-
ignored, and the process will be killed forcefully and abruptly (similar to
1704-
`'SIGKILL'`).
1703+
ignored except for `'SIGKILL'`, `'SIGTERM'`, `'SIGINT'` and `'SIGQUIT'`, and the
1704+
process will always be killed forcefully and abruptly (similar to `'SIGKILL'`).
17051705
See [Signal Events][] for more details.
17061706
17071707
On Linux, child processes of child processes will not be terminated

src/process_wrap.cc

+6
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,12 @@ class ProcessWrap : public HandleWrap {
312312
ProcessWrap* wrap;
313313
ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This());
314314
int signal = args[0]->Int32Value(env->context()).FromJust();
315+
#ifdef _WIN32
316+
if (signal != SIGKILL && signal != SIGTERM && signal != SIGINT &&
317+
signal != SIGQUIT) {
318+
signal = SIGKILL;
319+
}
320+
#endif
315321
int err = uv_process_kill(&wrap->process_, signal);
316322
args.GetReturnValue().Set(err);
317323
}

test/parallel/test-child-process-kill.js

+19
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,22 @@ assert.strictEqual(cat.signalCode, null);
3939
assert.strictEqual(cat.killed, false);
4040
cat.kill();
4141
assert.strictEqual(cat.killed, true);
42+
43+
// Test different types of kill signals on Windows.
44+
if (common.isWindows) {
45+
for (const sendSignal of ['SIGTERM', 'SIGKILL', 'SIGQUIT', 'SIGINT']) {
46+
const process = spawn('cmd');
47+
process.on('exit', (code, signal) => {
48+
assert.strictEqual(code, null);
49+
assert.strictEqual(signal, sendSignal);
50+
});
51+
process.kill(sendSignal);
52+
}
53+
54+
const process = spawn('cmd');
55+
process.on('exit', (code, signal) => {
56+
assert.strictEqual(code, null);
57+
assert.strictEqual(signal, 'SIGKILL');
58+
});
59+
process.kill('SIGHUP');
60+
}

0 commit comments

Comments
 (0)