Process抽象 接口

执行程序的方式。

使用静态的 startrun 方法启动一个新进程。run 方法以非交互方式执行进程直至完成。相反,start 方法允许您的代码与正在运行的进程交互。

使用 run 方法启动进程

以下代码示例使用 run 方法创建一个运行 UNIX 命令 ls 的进程,该命令列出目录内容。当进程终止时,run 方法使用一个 ProcessResult 对象来完成。这提供了访问从进程输出的方法和退出代码。run 方法不返回 Process 对象;这防止您的代码与正在运行的进程交互。

import 'dart:io';

main() async {
  // List all files in the current directory in UNIX-like systems.
  var result = await Process.run('ls', ['-l']);
  print(result.stdout);
}

使用 start 方法启动进程

以下示例使用 start 创建进程。start 方法返回一个 Future 来获得 Process 对象。当 future 完成,进程开始运行,并且您的代码可以与进程交互:写入 stdin、监听 stdout 等。

以下示例启动了 UNIX cat 实用程序,在不给出命令行参数的情况下,会回显其输入。程序将数据写入进程的标准输入流并将其打印到标准输出流。

import 'dart:io';
import 'dart:convert';

main() async {
  var process = await Process.start('cat', []);
  process.stdout
      .transform(utf8.decoder)
      .forEach(print);
  process.stdin.writeln('Hello, world!');
  process.stdin.writeln('Hello, galaxy!');
  process.stdin.writeln('Hello, universe!');
}

标准 I/O 流

如前一个代码示例所示,您可以通过 getter stdoutProcess 的标准输出流交互,并且您可以通过 getter stdinProcess 的标准输入流交互。此外,Process 还提供了一个 getter stderr,用于使用 Process 的标准错误流。

Process 的流与当前程序的顶级流是不同的。

注意: stdinstdoutstderr 是通过父进程和创建的后台子进程之间的管道实现的。这些管道的容量有限。如果后台子进程在没有读取输出的情况下写入 stderr 或 stdout 超过此限制,后台子进程会阻止等待管道缓冲区接受更多数据。例如

import 'dart:io';

main() async {
  var process = await Process.start('cat', ['largefile.txt']);
  // The following await statement will never complete because the
  // subprocess never exits since it is blocked waiting for its
  // stdout to be read.
  await process.stderr.forEach(print);
}

退出代码

调用 exitCode 方法以获取进程的退出代码。退出代码指示程序是否成功终止(通常用退出代码 0 表示)或出现错误。

如果使用 start 方法,exitCode 是通过进程对象上的 future 使用的(如下例所示)。如果使用 run 方法,exitCode 是通过 ProcessResult 实例上的 getter 使用的。

import 'dart:io';

main() async {
  var process = await Process.start('ls', ['-l']);
  var exitCode = await process.exitCode;
  print('exit code: $exitCode');
}

构造函数

Process()

属性

exitCode Future<int>
一个 Future,在进程完成时完成并带有进程的退出代码。
无设置器
hashCode int
此对象的哈希码。
无setter继承
pid int
进程的进程ID。
无设置器
runtimeType Type
对象的运行时类型的表示。
无setter继承
stderr Stream<List<int>>
进程的标准错误流作为 Stream
无设置器
stdin IOSink
进程的标准输入流作为 IOSink
无设置器
stdout Stream<List<int>>
进程的标准输出流作为 Stream
无设置器

方法

kill([ProcessSignal signal = ProcessSignal.sigterm]) bool
终止进程。
noSuchMethod(Invocation invocation) → dynamic
当尝试访问不存在的方法或属性时被调用。
继承
toString() String
该对象的字符串表示。
继承

运算符

operator ==(Object other) bool
等于运算符。
继承

静态方法

killPid(int pid, [ProcessSignal signal = ProcessSignal.sigterm]) bool
终止ID为 pid 的进程。
run(String executable, List<String> arguments, {String? workingDirectory, Map<String, String>? environment, bool includeParentEnvironment = true, bool runInShell = false, Encoding? stdoutEncoding = systemEncoding, Encoding? stderrEncoding = systemEncoding}) Future<ProcessResult>
启动一个进程并以非交互方式运行直到完成。进程运行指定了argumentsexecutable
runSync(String executable, List<String> arguments, {String? workingDirectory, Map<String, String>? environment, bool includeParentEnvironment = true, bool runInShell = false, Encoding? stdoutEncoding = systemEncoding, Encoding? stderrEncoding = systemEncoding}) ProcessResult
启动一个进程并运行直到完成。这是一个同步调用,将阻塞直到子进程终止。
start(String executable, List<String> arguments, {String? workingDirectory, Map<String, String>? environment, bool includeParentEnvironment = true, bool runInShell = false, ProcessStartMode mode = ProcessStartMode.normal}) Future<Process>
启动一个运行指定 argumentsexecutable 进程。