节点并与子进程对话

Node and talking to child processes

上下文

编写串行监视器来监听 Arduino 并不难。使用端口名称和波特率的命令行参数启动它很简单,因此从节点配置和启动监视器并不复杂:

child_process.exec("./monitor COM6 115200");

这个问题涉及execforkspawn,它们很相似,但有一些我还没有掌握的微妙之处。除了带参数启动外,我还需要

我使用 netcore 编写了一个控制台应用程序,该应用程序接受两个命令行参数,然后连接并监听,回显其 stdout。我选择netcore是因为它可以在所有三个平台上运行。

问题

我应该使用 execforkspawn 中的哪一个?

如何终止子进程?

如何捕获子进程的stdout

Node 文档讨论 kill method on a subprocess object。该页面上的示例代码暗示此对象由 spawn 返回,但当我使用 spawn 时,它似乎无声地失败了。那个或者它正在工作,但我不知道我在做什么,这就是我提出这个问题的原因。

所有这些 Node 代码都将成为 VSCode 扩展的一部分,所以如果您也知道这些,我想在可能的情况下将 stdout 通过管道传输到 VSCode OutputChannel。

借助 spawn,您可以收听标准输出。

然后使用 kill()

终止进程

来自 NodeJS 官方文档:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

// some logic
ls.kill()

编辑:一个更具体的例子:

// server.js --------------
const http = require('http');

const server = http.createServer(
    (function() {
        console.log('Initializing server');
        return (req, res) => {
            res.end('Hello World');
        };
    })()
);

server.listen(8080, () => console.log('Server is up on port ' + 8080));

// spawn.js --------------
const { spawn } = require('child_process');

const child = spawn('node', ['./server.js']);

child.stdout.on('data', data => console.log(data.toString()));

child.stderr.on('data', data => console.log('Error: ' + data));

child.on('close', code => console.log(`Process ended with code ${code}`));

child.on('error', err => console.log(err));

setTimeout(() => child.kill(), 2000);