Nodejs教程-Node.js的child_process模块提供了类似于popen(3)的功能,用于创建子进程。

有三种主要方式创建子进程:

  • child_process.exec()方法: 该方法在控制台中运行命令并缓冲输出。
  • child_process.spawn()方法: 该方法使用给定的命令启动一个新进程。
  • child_process.fork()方法: 该方法是spawn()方法的一种特殊情况,用于创建子进程。

Node.js child_process.exec()方法

child_process.exec()方法在控制台中运行命令并缓冲输出。

语法:

  1. child_process.exec(command[, options], callback)

参数:

1) command:指定要运行的命令,包含空格分隔的参数。

2) options:可能包含以下一个或多个选项:

  • cwd: 指定子进程的当前工作目录。
  • env: 指定环境变量的键值对。
  • encoding: 字符串(默认:'utf8')
  • shell: 指定要使用的Shell(默认:UNIX上为'/bin/sh',Windows上为'cmd.exe',Shell应该理解UNIX上的-c开关或Windows上的/s /c开关。在Windows上,命令行解析应与cmd.exe兼容。)
  • timeout: 数字(默认:0)
  • maxBuffer: 数字(默认:200*1024)
  • killSignal: 字符串(默认:'SIGTERM')
  • uid Number: 设置进程的用户标识。
  • gid Number: 设置进程的组标识。

callback: 回调函数接受三个参数error、stdout和stderr,当进程终止时调用该回调函数。

Node.js child_process.exec()示例1

让我们看一个简单的进程示例,打印进程的架构、进程ID、平台和版本。

文件:child_process_example1.js

const exec = require('child_process').exec;
exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

创建一个名为my.bat的批处理文件,其中包含以下代码:

文件:my.bat

mkdir child

在Node.js命令提示符中运行以下代码:

node child_process_example1.js

它将执行两个命令dirmkdir child。dir命令将显示当前目录列表,mkdir命令将创建一个新目录。对于Linux,您可以使用ls命令显示当前目录列表。

1.jpg

它还将创建一个新目录。

2.png

Node.js child_process.exec()示例2

创建两个名为support.js和master.js的js文件,代码如下:

文件:support.js

console.log("Child Process " + process.argv[2] + " executed.");

文件:master.js

const fs = require('fs');
const child_process = require('child_process');
for (var i = 0; i < 3; i++) {
  var workerProcess = child_process.exec('node support.js ' + i, function (error, stdout, stderr) {
    if (error) {
      console.log(error.stack);
      console.log('Error code: ' + error.code);
      console.log('Signal received: ' + error.signal);
    }
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
  });
  workerProcess.on('exit', function (code) {
    console.log('Child process exited with exit code ' + code);
  });
}

在Node.js命令提示符中运行以下代码:

node master.js

3.png

Node.js child_process.spawn()方法

child_process.spawn()方法使用给定的命令启动一个新进程。该方法返回流(stdout和stderr),通常用于进程返回大量数据。

语法:

  1. child_process.spawn(command, args)

参数:

1) command:指定要运行的命令。

2) args:指定一个字符串参数数组列表。

3) options:可能包含以下一个或多个选项:

  • cwd: 指定子进程的当前工作目录。
  • env: 指定环境变量的键值对。
  • stdio: 数组|字符串子进程的stdio配置
  • customFds: 数组已弃用,用于子进程使用的stdio的文件描述符
  • detached Boolean: 子进程将成为进程组的领导者
  • uid Number: 设置进程的用户标识。
  • gid Number: 设置进程的组标识。

Node.js child_process.spawn()示例

创建两个名为support.js和master.js的js文件,代码如下:

文件:support.js

console.log("Child Process " + process.argv[2] + " executed.");

文件:master.js

const fs = require('fs');
const child_process = require('child_process');
for (var i = 0; i < 3; i++) {
  var workerProcess = child_process.spawn('node', ['support.js', i]);
  workerProcess.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
  });
  workerProcess.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
  });
  workerProcess.on('close', function (code) {
    console.log('child process exited with code ' + code);
  });
}

在Node.js命令提示符中运行以下代码:

node master.js

4.png

Node.js child_process.fork()方法

child_process.fork方法是创建Node进程的一种特殊情况。此方法返回一个带有内置通信通道的对象,除了具有正常ChildProcess实例中的所有方法外。

语法:

  1. child_process.fork(modulePath, args)

参数:

1) modulePath:这是一个字符串,指定要在子进程中运行的模块。

2) args:指定一个字符串参数数组列表。

3) options:可能包含以下一个或多个选项:

  • cwd: 指定子进程的当前工作目录。
  • env: 指定环境变量的键值对。
  • execPath: 这是一个字符串,用于创建子进程的可执行文件。
  • execArgv: 指定一个字符串参数数组,传递给可执行文件(默认:process.execArgv)。
  • silent: 指定布尔值,如果为true,则子进程的stdin、stdout和stderr将被传输给父进程,否则它们将从父进程继承,有关更多详细信息,请参见spawn()的stdio的“pipe”和“inherit”选项(默认为false)。
  • uid Number: 设置进程的用户标识。
  • gid Number: 设置进程的组标识。

Node.js child_process.fork()示例

创建两个名为support.js和master.js的js文件,代码如下:

文件:support.js

console.log("Child Process " + process.argv[2] + " executed.");

文件:master.js

const fs = require('fs');
const child_process = require('child_process');
for (var i = 0; i < 3; i++) {
  var worker_process = child_process.fork("support.js", [i]);
  worker_process.on('close', function (code) {
    console.log('child process exited with code ' + code);
  });
}

在Node.js命令提示符中运行以下代码:

node master.js

5.png

标签: Nodejs, Nodejs安装教程, Nodejs教程, node, nodejs入门, nodejs入门教程, nodejs进阶, nodejs学习教程, nodejs开发, nodejs指南, nodejs学习指南, nodejs环境配置, nodejs框架