子进程
- 共享内存空间
- 子进程之间互相通信实现信息交换
- 子进程之间共享端口,分配请求
基本操作
/**************stdin*************/
process.stdin.resume();
process.stdin.on("data", function(chunk) {
process.stdout.write("进程收到数据:" + chunk);
});
/**************process.argv*************/
process.argv.forEach( function(val, index, array) {
console.log(index + ': ' + val);
});
/**************nextTick*************/
function foo() {
console.log("foo");
}
process.nextTick(foo);
console.log('bar');
setTimeout(foo,0)
console.log('bar');
/**************events*************/
process.on("exit", function() {
console.log("process exits");
})
process.on("uncaughtException", function(err) {
console.log('catch an uncaughtException:'+ err);
})
/************** Signal events*************/
process.on("SIGINT", function() {
console.log('receive SIGINT signal');
process.exit();
})
使用spawn创建子进程
- chlid_process(command,[args],[options])
- command:运行的命令
- args:传给命令的参数
- options:开启子进程的选项
- 子进程完成IO后自动退出
var child_process = require('child_process');
/************** child_process*************/
var opts = {
stdio:['pipe','pipe',process.stderr]
}
var spawn = child_process.spawn;
var sp1 = spawn('node', ['server.js']);
var sp2 = spawn('node', ['client.js'],{
stdout:'ignore'});
sp1.on("exit", function(code, signal) {
if (!code) {
console.log('sp1 exit, signal:' + signal);
} else {
console.log('sp1 exit, signal:' + signal);
}
process.exit();
})
sp2.stdout.on('data', function(data) {
console.log("subProcess2:" + data);
});
sp2.on("close", function(code, signal) {
console.log('sp2 close all stdio');
})
sp2.on("error", function(code, signal) {
console.log('sp2 error');
})
sp2.on("exit", function(code, signal) {
console.log('subProcess2 exits');
console.log('sp2 id:' + sp2.pid);
sp1.kill("SIGTERM");
})
process.on('exit', function() {
console.log('main process exits');
})
- 默认情况下,只有子进程全部退出,父进程才能退出
- 设置options的detached属性为true,使得允许父进程先退出,子进程继续执行IO
- 如果父进程与子进程共享IO,则父进程不允许先退出,主要子进程主动调用unref()方法才行