ZetCode

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

最佳实践

来源

Dart 进程文档

本教程通过实际示例介绍了 Dart 的 Process 类,展示了命令执行、I/O 处理、错误管理和并发进程。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Dart 教程