节点并与子进程对话

问题描述

上下文

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

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

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

  • 捕获输出,以便可以在窗口中显示
  • 杀死子进程
    • 使用不同的参数重新启动
    • 刷新Arduino,然后在重新启动后重新启动

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

问题

我应该使用哪个execforkspawn

如何杀死子进程?

如何捕获子进程的stdout

节点文档讨论了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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...