Dart ProcessStartMode
最后修改于 2025 年 4 月 4 日
Dart 中的 ProcessStartMode 类控制着新进程应如何启动。它与 Process.run 和 Process.start 方法一起使用。
ProcessStartMode 决定了标准输入、输出和错误流如何被处理。它是 Dart 的 dart:io 库的一部分,用于系统级操作。
基本定义
ProcessStartMode 是一个定义进程执行模式的枚举。它指定了进程流应如何与父进程连接。
可用的模式有:normal、detached、detachedWithStdio 和 inheritsStdio。每种模式都有不同的进程执行用例。
普通模式 (Normal Mode)
此示例展示了默认的 normal 模式,在这种模式下,所有标准流都会创建管道。
import 'dart:io';
void main() async {
var process = await Process.start(
'dart',
['--version'],
mode: ProcessStartMode.normal
);
var output = await process.stdout.transform(utf8.decoder).join();
print('Dart version: $output');
}
在普通模式下,进程会为 stdin、stdout 和 stderr 创建管道。父进程可以读写这些流。这是默认模式。
$ dart main.dart Dart version: Dart SDK version: 2.19.0 (stable)
分离模式 (Detached Mode)
此示例演示了 detached 模式,在这种模式下,进程独立运行,没有流连接。
import 'dart:io';
void main() async {
var process = await Process.start(
'sleep',
['5'],
mode: ProcessStartMode.detached
);
print('Process started with PID: ${process.pid}');
print('Process will run independently for 5 seconds');
}
在分离模式下,进程独立运行,没有流连接。父进程无法通过流与子进程通信。
$ dart main.dart Process started with PID: 12345 Process will run independently for 5 seconds
分离并继承标准输入输出 (Detached With Stdio)
此示例展示了 detachedWithStdio 模式,在这种模式下,进程继承父进程的标准流,但独立运行。
import 'dart:io';
void main() async {
var process = await Process.start(
'dart',
['--version'],
mode: ProcessStartMode.detachedWithStdio
);
print('Process started with PID: ${process.pid}');
print('Output will go to parent process stdout');
}
在此模式下,进程继承 stdio 但独立运行。输出出现在父进程的控制台中,但父进程无法以编程方式访问流。
$ dart main.dart Process started with PID: 12346 Output will go to parent process stdout Dart SDK version: 2.19.0 (stable)
继承标准输入输出 (Inherits Stdio)
此示例演示了 inheritsStdio 模式,在这种模式下,进程共享父进程的标准流。
import 'dart:io';
void main() async {
var process = await Process.start(
'echo',
['Hello from child process'],
mode: ProcessStartMode.inheritsStdio
);
await process.exitCode;
print('Child process completed');
}
在 inheritsStdio 模式下,子进程共享父进程的 stdin、stdout 和 stderr。输出直接显示在控制台中,无需重定向。
$ dart main.dart Hello from child process Child process completed
将模式与 Process.run 结合使用
此示例展示了如何将 ProcessStartMode 与 Process.run 结合使用,以简化进程执行,同时控制流行为。
import 'dart:io';
void main() async {
var result = await Process.run(
'ls',
['-l'],
runInShell: true,
mode: ProcessStartMode.inheritsStdio
);
print('Exit code: ${result.exitCode}');
}
Process.run 简化了进程执行,同时仍然允许模式控制。在这种情况下,由于 inheritsStdio 模式,输出直接发送到控制台。
$ dart main.dart total 8 -rw-r--r-- 1 user group 123 Apr 4 10:00 main.dart Exit code: 0
最佳实践
- 默认: 当你需要流通信时,使用 normal 模式
- 后台: 对于长时间运行的后台任务,使用 detached 模式
- 控制台: 对于简单的命令行工具,使用 inheritsStdio 模式
- 安全: 使用 inheritsStdio 处理敏感输入时要小心
来源
本教程介绍了 Dart 的 ProcessStartMode 类,并通过实际示例展示了不同的进程执行模式及其用例。
作者
列出 所有 Dart 教程。