◐ Shell
clean mode source ↗

src: fix kill signal on Windows · nodejs/node@2ca9f4b

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

Original file line numberDiff line numberDiff line change

@@ -314,6 +314,12 @@ class ProcessWrap : public HandleWrap {

314314

ProcessWrap* wrap;

315315

ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This());

316316

int signal = args[0]->Int32Value(env->context()).FromJust();

317+

#ifdef _WIN32

318+

if (signal != SIGKILL && signal != SIGTERM && signal != SIGINT &&

319+

signal != SIGQUIT) {

320+

signal = SIGKILL;

321+

}

322+

#endif

317323

int err = uv_process_kill(&wrap->process_, signal);

318324

args.GetReturnValue().Set(err);

319325

}

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+

}