Skip to content

child_process 模块用于创建子进程

js
const childProcess = require('node:child_process')

console.log(childProcess)

// process不包含fork方法
const process = require('node:process')
console.log(process.fork)

打印的 childProcess 大致如下:

js
{
  _forkChild: [Function: _forkChild],
  ChildProcess: [Function: ChildProcess],
  exec: [Function: exec],
  execFile: [Function: execFile],
  execFileSync: [Function: execFileSync],
  execSync: [Function: execSync],
  fork: [Function: fork],
  spawn: [Function: spawn],
  spawnSync: [Function: spawnSync]
}

1.exec

exec 方法用于执行一个命令字符串,并返回一个 ChildProcess 对象。

js
/*
child_process.exec(command[, options][, callback])
*/
const childProcess = require('node:child_process')

childProcess.exec('ls -l', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`)
    return
  }
  console.log(`stdout: ${stdout}`)
  console.error(`stderr: ${stderr}`)
})

2.execFile

execFile 方法用于执行一个可执行文件,并返回一个 ChildProcess 对象。

js
const { execFile } = require('child_process')

execFile('node', ['--version'], (error, stdout, stderr) => {
  if (error) {
    console.error(`execFile error: ${error}`)
    return
  }
  console.log(`stdout: ${stdout}`)
  if (stderr) {
    console.error(`stderr: ${stderr}`)
  }
})

3.fork

forkNode.js 中用于创建子进程的一种特殊方法,它与 spawn 类似,但专门用于生成新的 Node.js 进程。

fork 创建的子进程会默认启用 IPC(进程间通信)通道,便于父进程和子进程之间传递消息。

js
// parent.js
const { fork } = require('child_process')
const path = require('node:path')

// 创建子进程
const child = fork(path.resolve(__dirname, './3.fork_child.js'))

// 监听来自子进程的消息
child.on('message', (message) => {
  console.log(`Received message from child: ${message}`)
})

// 向子进程发送消息
child.send('Hello from parent!')

child.on('exit', (code, signal) => {
  console.log(`Child process exited with code ${code} and signal ${signal}`)
})
js
// child.js
// 监听来自父进程的消息
process.on('message', (message) => {
  console.log(`Received message from parent: ${message}`)
  
  // 向父进程发送消息
  process.send('Hello from child!')
})

4.spawn

spawn 是一种用于在 Node.js 应用程序中创建新子进程的函数。

它提供了一种轻量级的方式来启动外部命令或程序,并且可以异步处理它们的输入和输出。

js
const { spawn } = require('child_process')

const ls = spawn('ls', ['-lh', '/users'])

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`)
})

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`)
})

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`)
})