- child_process.spawn可以利用命令行创建一个子进程,并且可以控制子进程的启动,终止,以及通信
/***************
* spawn创建了一个子进程,并返回一个进程描述符,即句柄
* 进程句柄都有一个stdout属性,以流的形式输出进程的标准输出信息
* 可以在这个输出流上绑定事件,监视每个输出
* ****************/
var spawn = require('child_process').spawn;
var child = spawn('tail', ['-f', './test']);
child.stdout.on('data', function (data) {
console.log('tail output: ' + data);
});
setTimeout(() => {
child.kill();
}, 1000);
child.on('exit', (code, signal) => {
if (code) {
console.log('child process terminated with code ' + code);
} else {
console.log('child process terminated with signal ' + signal);
}
});
- spawn创建的子进程,父进程可以通过标准输入输出流与子进程通信
//创建子进程2
var child2 = spawn('node', ['add1']);
//产生一个随机数
var number = Math.ceil(Math.random() * 1000);
//向子进程输入一个数字
child2.stdin.write(number + "\n");
//获取子进程的标准输出
child2.stdout.once('data', (data) => {
console.log('child2 get number ' + number + ' replies with ' + data);
});
child.stderr.on('data', (data) => {
process.stdout.write(data);
});
setTimeout(() => {
//可以发送一个信号终止进程
child2.kill('SIGINT');
}, 5000);
- 创建add1.js
这个程序从标准输入流中读取一个数,加1后输出
//恢复标准输入流
process.stdin.resume();
//输入一个数字,加1再输出
process.stdin.on('data', (data) => {
var number;
try {
number = parseInt(data.toString(), 10);
number++;
process.stdout.write(number + "\n");
} catch (err) {
process.stdout.write(err.message + "\n");
}
});