- child_process.spawn可以利用命令行创建一个子进程,并且可以控制子进程的启动,终止,以及通信
/***************
* spawn创建了一个子进程,并返回一个进程描述符,即句柄
* 进程句柄都有一个stdout属性,以流的形式输出进程的标准输出信息
* 可以在这个输出流上绑定事件,监视每个输出
* ****************/
//tail命令会监控一个文件(不存在则退出),
//如果文件发生改变则在标准输出流中输出文件内容
var spawn = require(‘child_process‘).spawn;
//创建一个子进程,将进程描述符赋值给child
var child = spawn(‘tail‘, [‘-f‘, ‘./test‘]);
//监听标准输出流
child.stdout.on(‘data‘, function (data) {
console.log(‘tail output: ‘ + data);
});
//终止进程
setTimeout(() => {
//默认发送SIGTERM
child.kill();
}, 1000);
//监听子进程退出事件
child.on(‘exit‘, (code, signal) => {
if (code) {
//正常退出会有一个退出码,0为正常退出,非0一般表示错误
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");
}
});
时间: 2024-12-15 10:06:00