start静态方法
启动一个运行指定arguments
的executable
进程。
返回一个Future<Process>
,当进程成功启动时完成,返回一个Process实例。该Process对象可用于与进程交互。如果进程无法启动,返回的Future将完成一个异常。
建议使用绝对路径作为executable
,因为解析executable
路径是特定平台的。在Windows上,environment
参数中设置的任何PATH
以及workingDirectory
参数中设置的路径在解析executable
路径时都被忽略。
使用workingDirectory
设置进程的工作目录。请注意,在某些平台上,在执行进程之前会更改目录,这可能会在使用可执行文件和参数的相对路径时产生影响。
使用environment
设置进程的环境变量。如果没有设置,则继承父进程的环境。目前,仅支持US-ASCII环境变量,如果传递了范围之外的代码点的环境变量,则很可能发生错误。
如果includeParentEnvironment
为true
,进程的环境将包括父进程的环境,其中environment
具有优先权。默认值为true
。
如果runInShell
为true
,则通过系统shell启动进程。在Linux和OS X上使用/bin/sh
,而在Windows上使用%WINDIR%\system32\cmd.exe
。
注意:在Windows上,如果executable
是批处理文件('.bat'或'.cmd'),无论runInShell
的值如何,操作系统都可能在系统shell中启动它。这可能导致根据shell规则解析参数。例如
void main() async {
// Will launch notepad.
Process.start('test.bat', ['test¬epad.exe']);
}
用户必须读取使用Process.start
启动的进程的所有来自stdout和stderr流的全部数据。如果用户没有读取流上的所有数据,则底层系统资源将不会被释放,因为还有待处理的数据。
以下代码使用Process.start
在Linux上搜索文件test.dart
中的main
。
var process = await Process.start('grep', ['-i', 'main', 'test.dart']);
stdout.addStream(process.stdout);
stderr.addStream(process.stderr);
如果 mode
是 ProcessStartMode.normal(默认值),则子进程将以 stdin
、stdout
和 stderr
连接到其父进程。只要子进程在运行,父进程就不会退出,除非父进程调用 exit。如果父进程调用 exit,则父进程将被终止,但子进程将继续运行。
如果 mode
是 ProcessStartMode.detached,则将创建一个独立进程。独立进程与其父进程没有连接,并且可以在父进程死亡时独立运行。从独立进程唯一可用的信息是它的 pid
。它没有连接到其 stdin
、stdout
或 stderr
,并且在它终止时,进程的退出代码将不可用。
如果 mode
是 ProcessStartMode.detachedWithStdio,则将创建一个独立进程,其中 stdin
、stdout
和 stderr
连接。创建者可以通过这些来与子进程通信。即使这些通信通道关闭或父进程死亡,独立进程也会继续运行。进程的退出代码在终止时将不可用。
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});