node.js 创建子进程 II

  • 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");
    }
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值