child_process是nw.exe的一个内置模块,通过它可以实现创建多线程,并可实现主线程和子线程之间的通信。child_process模块中主要使用有两个方法spawn和exec,这两个方法都可以用来创建子线程。除了spawn和exec外,child_process模块还有execFile,fork,spawnSync,execFileSync,execSync,它们都是基于spawn的不同封装。
使用child_process模块模块不外乎几种情况:1.调用系统命令行 2.打开第三方软件 3.打开第三方软件并实现通信。
var cp = require('child_process'); //子进程
var result = "";
cp.exec("ipconfig", function(error, stdout, stderr) {
console.log("error", error);
console.log("stdout", stdout);
console.log("stderr", stderr);
});
result = cp.spawn('cmd.exe', ['/s', '/c', 'ipconfig']);
result.on('close', function(code) {
console.log('child process exited with code :' + code);
});
result.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
result.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
(1)两者实现的写法不同,参照上述Demo即可了解。
(2)spawn在执行时会返回一个stdout和stderr流对象,为边执行边返回。exec是在执行完成后返回一个完整的buffer,这个buffer的大小应该是200k。如果子进程返回的数据大小超过了200k,程序将会崩溃,同时显示错误信息"Error:maxBuffer exceeded"。
(3)spawn在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行。exec只能通过返回的buffer去识别完成状态,识别起来较为麻烦。
上述(一)中已经介绍如何调用系统命令行,下面为打开第三方软件的例子,如使用exec打开QQ程序:
var cp = require('child_process'); //子进程
var path = "";//第三方根目录
cp.exec(path + "\\QQ.exe", function(error, stdout, stderr) {
console.log("error", error);
console.log("stdout", stdout);
console.log("stderr", stderr);
});
var cp = require('child_process'); //子进程
var path = ""; //第三方根目录
result = cp.spawn(path + "\\ffmpeg.exe", ['-y', '-i', "1.mpg", '1.mp4']);
result.on('close', function(code) {
console.log('child process exited with code :' + code);
});
result.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
result.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
result.kill();
function killFFmpeg() {
cp.exec('tasklist | find "ffmpeg.exe"', function(error, stdout, stderr) {
if(stdout != "") {
cp.exec("taskkill /f /t /im ffmpeg.exe", function(error, stdout, stderr) {});
}
});
};