执行程序的方法。
使用静态的 start 和 run 方法来启动一个新进程。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 stdout 与 Process
的标准输出流交互,您可以通过 getter stdin 与 Process
的标准输入流交互。此外,Process
还提供了一个 getter stderr,用于使用 Process
的标准错误流。
Process
的流与当前程序的顶级流不同。
注意: stdin
、stdout
和 stderr
是通过父进程和派生子进程之间的管道实现的。这些管道的容量有限。如果子进程在未读取输出的情况下写入 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');
}
属性
方法
-
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> - 启动一个进程并以其非交互方式运行至完成。进程运行时使用指定的
arguments
。 -
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> - 启动一个执行指定
arguments
的executable
进程。