Dart 进程
最后修改于 2025 年 4 月 4 日
Dart 中的 Process 类提供了运行和与系统进程交互的功能。它是 Dart dart:io 库的一部分,可用于命令行应用程序。
进程允许执行命令、读取其输出、写入其输入以及监控其退出状态。它对于 Dart 中的系统级编程至关重要。
基本定义
Process 代表一个本地系统进程。它提供了启动、与外部程序通信和控制外部程序的方法。
主要功能包括进程生命周期管理、I/O 流访问和退出码处理。它同时支持同步和异步操作。
运行简单命令
本示例展示了如何运行一个基本的系统命令并读取其输出。
main.dart
import 'dart:io';
void main() async {
var process = await Process.start('ls', ['-l']);
process.stdout.transform(utf8.decoder).listen((data) {
print(data);
});
var exitCode = await process.exitCode;
print('Exit code: $exitCode');
}
我们异步启动 'ls -l' 命令并监听其 stdout 流。当进程终止时,exitCode future 会完成。
$ dart main.dart total 12 -rw-r--r-- 1 user user 220 Apr 4 10:00 main.dart Exit code: 0
处理输入和输出
本示例演示了与进程的双向通信。
main.dart
import 'dart:io';
import 'dart:convert';
void main() async {
var process = await Process.start('grep', ['dart']);
process.stdin.writeln('This line contains dart');
process.stdin.writeln('This line does not');
await process.stdin.close();
process.stdout.transform(utf8.decoder).listen((data) {
print('Found: $data');
});
await process.exitCode;
}
我们启动 grep 来过滤包含 'dart' 的行。我们写入其 stdin 并从 stdout 读取过滤后的结果。写入完成后务必关闭 stdin。
$ dart main.dart Found: This line contains dart
同步运行
本示例展示了如何运行命令并等待其完成。
main.dart
import 'dart:io';
void main() async {
var result = await Process.run('date', ['+%Y-%m-%d']);
print('Output: ${result.stdout}');
print('Error: ${result.stderr}');
print('Exit code: ${result.exitCode}');
}
Process.run 执行命令并收集所有输出。完成后,它会返回一个包含 stdout、stderr 和退出码的 ProcessResult。
$ dart main.dart Output: 2025-04-04 Error: Exit code: 0
处理错误
本示例演示了进程失败时的错误处理。
main.dart
import 'dart:io';
void main() async {
try {
var result = await Process.run('nonexistent', []);
print(result.stdout);
} on ProcessException catch (e) {
print('Process failed: ${e.message}');
}
}
我们尝试运行一个不存在的命令。当进程无法启动时,会抛出 ProcessException。务必处理潜在的进程失败。
$ dart main.dart Process failed: No such file or directory
运行多个进程
本示例展示了如何同时运行和管理多个进程。
main.dart
import 'dart:io';
void main() async {
var processes = [
Process.start('sleep', ['2']),
Process.start('echo', ['hello']),
Process.start('date', []),
];
var results = await Future.wait(processes);
for (var process in results) {
print('Process ${process.pid} exited with ${await process.exitCode}');
}
}
我们同时启动三个进程并等待它们全部完成。每个 Process 对象都提供了进程 ID 和退出状态。
$ dart main.dart Process 1234 exited with 0 Process 1235 exited with 0 Process 1236 exited with 0
最佳实践
- 流处理:始终监听 stdout/stderr 以防止死锁
- 错误处理:捕获 ProcessException 以处理启动失败
- 资源清理:关闭 stdin 并取消流订阅
- 超时:考虑为长时间运行的进程使用超时
- 安全:清理命令参数以防止注入
来源
本教程通过实际示例介绍了 Dart 的 Process 类,展示了命令执行、I/O 处理、错误管理和并发进程。
作者
列出 所有 Dart 教程。