start 静态方法

Future<Process> start(
  1. String executable,
  2. List<String> arguments,
  3. {String? workingDirectory,
  4. Map<String, String>? environment,
  5. bool includeParentEnvironment = true,
  6. bool runInShell = false,
  7. ProcessStartMode mode = ProcessStartMode.normal}
)

启动一个运行指定 argumentsexecutable 的进程。

返回一个 Future<Process>,当进程成功启动时完成,完成时将返回一个 Process 实例。该 Process 对象可以用来与进程交互。如果进程无法启动,返回的 Future 将完成时抛出异常。

建议使用绝对路径来指定 executable,因为解析 executable 路径是平台特定的。在Windows上,无论是环境映射参数中的任何 PATH 设置还是在 workingDirectory 参数中设置的路径,都忽略用于解析 executable 路径的用途。

使用 workingDirectory 为进程设置工作目录。请注意,在一些平台上,更改目录发生在执行进程之前,这可能会在用于可执行文件和参数的相对路径中使用时产生影响。

使用 environment 设置进程的环境变量。如果没有设置,将继承父进程的环境。目前,仅支持US-ASCII环境变量,如果传递了编码点超出US-ASCII范围的变量,则可能会发生错误。

如果 includeParentEnvironmenttrue,进程的环境将包括父进程的环境,其中 environment 优先。默认值为 true

如果 runInShelltrue,进程将通过系统shell启动。在Linux和OS X上使用 /bin/sh,而在Windows上使用 %WINDIR%\system32\cmd.exe

用户必须读取使用 Process.start 启动的进程的 stdoutstderr 流中所有的数据。如果用户没有读取流中的所有数据,则底层系统资源不会释放,因为仍有待处理的数据。

以下代码使用 Process.start 在Linux上在文件 test.dart 中搜索 main

var process = await Process.start('grep', ['-i', 'main', 'test.dart']);
stdout.addStream(process.stdout);
stderr.addStream(process.stderr);

如果 modeProcessStartMode.normal(默认值),则将启动一个管道连接到 stdinstdoutstderr 的子进程。

如果mode设置为ProcessStartMode.detached,则会创建一个分离进程。分离进程与其父进程没有连接,当父进程终止时可以独立运行。从分离进程可获得的信息只有其pid。与stdinstdoutstderr没有连接,进程结束时的退出代码也无法获得。

如果mode设置为ProcessStartMode.detachedWithStdio,则会创建一个分离进程,其中stdinstdoutstderr是连接在一起的。创建者可以通过这些通道与子进程通信。即使通信渠道关闭,分离进程也会继续运行。进程结束时的退出代码也无法获得。

mode的默认值是ProcessStartMode.normal

实现

external static Future<Process> start(
    String executable, List<String> arguments,
    {String? workingDirectory,
    Map<String, String>? environment,
    bool includeParentEnvironment = true,
    bool runInShell = false,
    ProcessStartMode mode = ProcessStartMode.normal});