ZetCode

Dart ProcessStartMode

最后修改于 2025 年 4 月 4 日

Dart 中的 ProcessStartMode 类控制着新进程应如何启动。它与 Process.runProcess.start 方法一起使用。

ProcessStartMode 决定了标准输入、输出和错误流如何被处理。它是 Dart 的 dart:io 库的一部分,用于系统级操作。

基本定义

ProcessStartMode 是一个定义进程执行模式的枚举。它指定了进程流应如何与父进程连接。

可用的模式有:normaldetacheddetachedWithStdioinheritsStdio。每种模式都有不同的进程执行用例。

普通模式 (Normal Mode)

此示例展示了默认的 normal 模式,在这种模式下,所有标准流都会创建管道。

main.dart
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 模式,在这种模式下,进程独立运行,没有流连接。

main.dart
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 模式,在这种模式下,进程继承父进程的标准流,但独立运行。

main.dart
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 模式,在这种模式下,进程共享父进程的标准流。

main.dart
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 结合使用

此示例展示了如何将 ProcessStartModeProcess.run 结合使用,以简化进程执行,同时控制流行为。

main.dart
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

最佳实践

来源

Dart ProcessStartMode 文档

本教程介绍了 Dart 的 ProcessStartMode 类,并通过实际示例展示了不同的进程执行模式及其用例。

作者

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

列出 所有 Dart 教程