具体用法参考官方文档即可,已经写的很清楚。本文仅做一些简单对比。
简单对比
方法 | spawn | fork | exec | execFile |
---|---|---|---|---|
是否通过 shell 执行子命令 | 否(*) | 否 | 是 | 否(*) |
读取程序输出 | 利用子进程的 stdout / stderr | 利用子进程的 stdout / stderr | 在 callback 中一次返回 | 在 callback 中一次返回 |
父子进程通信 | process.send() 与 process.on("message") (仅当子进程为 Node 脚本时可用) |
process.send() 与 process.on("message") |
不支持 | 不支持 |
备注 | 仅限执行 Node 脚本 |
说明
fork
、exec
、execFile
都是spawn
的一种特殊情况,内部都是调用了spawn
方法。spwan
和execFile
默认是创建子进程直接执行指定命令,但是可以通过 option 中的shell
字段来明确要求在一个 shell 中执行命令。- 由于
exec
和execFile
会把子进程的 stdout 和 stderr 缓存起来一次性返回给调用方,在子进程退出之前,这些缓存数据会在内存中不断累积。为了防止内存占用过多导致的问题,这两个方法的参数对象中接受一个maxBuffer
字段,表示缓存数据的上限大小,超过该大小会导致子进程被kill()
且缓存数据会被截断。该参数的默认值是1024 * 1024
。 - 以上几个方法的源码都在
lib/child_process.js
中可以找到。