问题描述
上下文
编写一个串行监视器来收听Arduino并不难。使用命令行参数来启动端口名称和波特率很简单,因此从节点配置和启动监视器并不复杂:
child_process.exec("./monitor COM6 115200");
这个问题涉及exec
,fork
和spawn
,它们相似,但有一些微妙之处,我尚未掌握。除了使用参数启动外,我还需要
我用netcore编写了一个控制台应用程序,该应用程序带有两个命令行参数,然后进行连接和侦听,并回显其stdout
。我选择netcore是因为它可以在所有三个平台上运行。
问题
我应该使用哪个exec
,fork
和spawn
?
如何杀死子进程?
如何捕获子进程的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);