为什么在 Node.js 中向子进程 stdin 写入 CTRL+C 不会终止进程,而通过管道传输却会终止进程?

问题描述 投票:0回答:1

我有一个用于测试命令行应用程序的函数。它使用 Node.js child_process.exec 来运行 shell 命令,如下所示:

const proc = child_process.exec(command, { env, timeout }, (error) =>
  errorHandler(error)
);

然后,我会监听来自

proc.stdout
的事件,并通过写信给
proc.stdin
来响应提示。我想通过编写代表 CTRL + C 的 ASCII 字符将 SIGINT 信号传递给子进程,以优雅地停止该进程。我尝试过“^C”和“\x03”,但它们不起作用。但是,通过管道将这些字符传递给命令是可行的:

child_process.exec(`printf '^C' | command`);

这两种方法有什么区别?为什么写入标准输入不起作用而管道却起作用?

注意!我在 Ubuntu 中使用默认的 /bin/sh (dash)。这两种方法都不适用于 Windows。

node.js sh
1个回答
0
投票

问题在于,文本

^C
并没有终止任何内容,它实际上毫无意义。

杀死进程的是发送

SIGINT
信号。现在,在终端中,
CTRL+C
^C
是发送
SIGINT
信号的快捷方式,但是,您所做的只是发送文本

如果你想正确终止进程,你必须发送

SIGINT
信号。您可以使用此代码来做到这一点
child_process.kill('SIGINT');

© www.soinside.com 2019 - 2024. All rights reserved.