cwd: path.join(__dirname, "test") // 指定子进程的当前工作目录
// stdin: [process.stdin, process.stdout, process.stderr] stdio: [0, 1, 2] // 配置标准输入、标准输出、错误输出
});
// C:Program Filesnodejsnode.exe,g:processtestsub_process.js,--port,3000
// 文件:~test/sub_process.js
// 使用主进程的标准输出,输出 sub_process.js 文件执行的参数
process.stdout.write(process.argv.toString());通过上面配置 options 的 stdio 值为数组,上面的两种写法作用相同,都表示子进程和主进程共用了主进程的标准输入、标准输出、和错误输出,实际上并没有实现主进程与子进程的通信,其中 0 和 stdin 代表标准输入,1 和 stdout 代表标准输出,2 和 stderr 代表错误输出。
上面这样的方式只要子进程执行 sub_process.js 就会在窗口输出,如果我们希望是否输出在主进程里面控制,即实现子进程与主进程的通信,看下面用法。
// 文件:process.js
const { spawn } = require("child_process");
const path = require("path");// 创建子进程
let child = spawn("node", ["sub_process.js"], {
cwd: path.join(__dirname, "test"),
stdio: ["pipe"]});
child.stdout.on("data", data => console.log(data.toString()));
// hello world
// 文件:~test/sub_process.js
// 子进程执行 sub_process.js
process.stdout.write("hello world");上面将 stdio 内数组的值配置为 pipe(默认不写就是 pipe),则通过流的方式实现主进程和子进程的通信,通过子进程的标准输出(可写流)写入,在主进程通过子进程的标准输出通过 data 事件读取的流在输出到窗口(这种写法很少用),上面都只在主进程中开启了一个子进程,下面举一个开启多个进程的例子。
例子的场景是主进程开启两个子进程,先运行子进程 1 传递一些参数,子进程 1 将参数取出返还给主进程,主进程再把参数传递给子进程 2,通过子进程 2 将参数写入到文件 param.txt 中,这个过程不代表真实应用场景,主要目的是体会主进程和子进程的通信过程。
// 文件:process.js
const { spawn } = require("child_process");
const path = require("path");// 创建子进程
let child1 = spawn("node", ["sub_process_1.js", "--port", "3000"], {
cwd: path.join(__dirname, "test"),
});
let child2 = spawn("node", ["sub_process_2.js"], {
cwd: path.join(__dirname, "test"),
});
// 读取子进程 1 写入的内容,写入子进程 2
child1.stdout.on("data", data => child2.stdout.write(data.toString));









