Skip to content

Commit 070e103

Browse files
src: fix kill signal on Windows
Fixes: #42923
1 parent eb63cd2 commit 070e103

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

doc/api/child_process.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,8 +1698,8 @@ may not actually terminate the process.
16981698
See kill(2) for reference.
16991699
17001700
On Windows, where POSIX signals do not exist, the `signal` argument will be
1701-
ignored, and the process will be killed forcefully and abruptly (similar to
1702-
`'SIGKILL'`).
1701+
ignored except `'SIGKILL'`, `'SIGTERM'`, `'SIGINT'` and `'SIGQUIT'`, and the
1702+
process will be killed forcefully and abruptly (similar to `'SIGKILL'`).
17031703
See [Signal Events][] for more details.
17041704
17051705
On Linux, child processes of child processes will not be terminated

src/process_wrap.cc

Lines changed: 6 additions & 0 deletions
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 &&
317+
signal != SIGINT && 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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,41 @@ 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+
const process1 = spawn('cmd');
46+
process1.on('exit', (code, signal) => {
47+
assert.strictEqual(code, null);
48+
assert.strictEqual(signal, 'SIGTERM');
49+
});
50+
process1.kill('SIGTERM');
51+
52+
const process2 = spawn('cmd');
53+
process2.on('exit', (code, signal) => {
54+
assert.strictEqual(code, null);
55+
assert.strictEqual(signal, 'SIGKILL');
56+
});
57+
process2.kill('SIGKILL');
58+
59+
const process3 = spawn('cmd');
60+
process3.on('exit', (code, signal) => {
61+
assert.strictEqual(code, null);
62+
assert.strictEqual(signal, 'SIGQUIT');
63+
});
64+
process3.kill('SIGQUIT');
65+
66+
const process4 = spawn('cmd');
67+
process4.on('exit', (code, signal) => {
68+
assert.strictEqual(code, null);
69+
assert.strictEqual(signal, 'SIGINT');
70+
});
71+
process4.kill('SIGINT');
72+
73+
const process5 = spawn('cmd');
74+
process5.on('exit', (code, signal) => {
75+
assert.strictEqual(code, null);
76+
assert.strictEqual(signal, 'SIGKILL');
77+
});
78+
process5.kill('SIGHUP');
79+
}

0 commit comments

Comments
 (0)