本文档涵盖了 Bun 的进程管理 API、环境变量处理和系统交互功能。它详细介绍了全局 process 对象的实现、环境变量管理、平台检测以及使 JavaScript 应用程序能够与底层系统交互的操作系统级集成。
有关核心 JavaScript 运行时和事件循环的信息,请参阅 ZigGlobalObject 和事件循环。有关模块加载和解析,请参阅 模块系统和加载。
在 Bun 中,Process 类是进程相关功能的核心接口。它继承自 JSEventEmitter,并提供对进程状态、环境变量和系统信息的访问。
Process 类维护多个惰性属性和写屏障,以实现高效的内存管理。
| 属性 | 类型 | 目的 |
|---|---|---|
m_cpuUsageStructure | LazyProperty<Process, Structure> | CPU 使用统计结构 |
m_resourceUsageStructure | LazyProperty<Process, Structure> | 资源使用数据结构 |
m_memoryUsageStructure | LazyProperty<Process, Structure> | 内存使用信息 |
m_cachedCwd | WriteBarrier<JSString> | 缓存的当前工作目录 |
m_argv | WriteBarrier<Unknown> | 进程参数数组 |
m_execArgv | WriteBarrier<Unknown> | 执行参数数组 |
来源:src/bun.js/bindings/BunProcess.h18-75 src/bun.js/bindings/BunProcess.cpp1-50
环境变量访问由 JSEnvironmentVariableMap 类处理,该类提供了对系统环境变量的 JavaScript 可访问接口,并具备正确的 UTF-8 编码处理。
环境变量实现支持:
process.env 的更改会立即影响系统环境变量。Object.keys()、JSON.stringify() 和迭代。来源:src/bun.js/bindings/BunProcess.cpp28 test/js/node/process/process.test.js150-173
Bun 通过跨多个模块实现的各种 API,提供全面的平台检测和系统信息。
| API | 实现 | 平台支持 |
|---|---|---|
process.platform | constructPlatform() | darwin, linux, win32 |
process.arch | constructArch() | x64,arm64 |
os.cpus() | cpusImpl{Linux,Darwin,Windows}() | 所有平台 |
os.freemem() | Bun__Os__getFreeMemory() | 所有平台 |
os.totalmem() | 特定于平台的 API | 所有平台 |
os.uptime() | 系统运行时间调用 | 所有平台 |
来源:src/bun.js/bindings/BunProcess.cpp158-180 src/bun.js/node/node_os.zig12-62 src/bun.js/bindings/OsBinding.cpp1-45
进程控制包括退出处理、信号管理和进程状态转换。
进程对象会发出各种生命周期事件:
| 事件 | 触发器 | 实现 |
|---|---|---|
exit | 进程终止 | dispatchExitInternal() |
beforeExit | 在进程结束之前 | 事件循环空闲检查 |
uncaughtException | 未捕获的错误 | 异常处理器 |
unhandledRejection | 未处理的 Promise 拒绝 | Promise 拒绝跟踪 |
来源:src/bun.js/bindings/BunProcess.cpp261-282 test/js/node/process/process.test.js375-430
Bun 实现了与 Node.js 兼容的全面资源监控 API。
资源使用 API 提供对以下内容的访问:
来源:test/js/node/test/parallel/test-resource-usage.js1-31 src/bun.js/bindings/BunProcess.h21-23
不同的操作系统需要专门的实现来收集系统信息。
| 平台 | 特殊功能 | 实现细节 |
|---|---|---|
| Linux | 解析 /proc 文件系统 | 直接文件系统访问以获取 CPU 和内存信息。 |
| macOS | sysctl 系统调用 | Mach 内核 API 用于系统统计。 |
| Windows | Win32 API | 控制台模式管理、UTF-16 处理。 |
每个平台在内存信息收集方面都有不同的实现方式:
sysinfo() 系统调用和 /proc/meminfo 解析。host_statistics() 使用 Mach VM 统计 API。uv_get_available_memory()。来源:src/bun.js/node/node_os.zig64-148 src/bun.js/bindings/OsBinding.cpp12-44 src/output.zig144-274