Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

函数

func execute(String, Array<String>, ?Path, ?Map<String, String>, ProcessRedirect, ProcessRedirect,ProcessRedirect, ?Duration)

public func execute(
    command: String,
    arguments: Array<String>,
    workingDirectory!: ?Path = None,
    environment!: ?Map<String, String> = None,
    stdIn!: ProcessRedirect = Inherit,
    stdOut!: ProcessRedirect = Inherit,
    stdErr!: ProcessRedirect = Inherit,
    timeout!: ?Duration = None
): Int64

功能:根据输入参数创建并运行一个子进程,等待该子进程运行完毕并返回子进程退出状态。

注意:

  • 不支持平台:iOS。
  • Windows 平台上,在子进程执行完成后立即删除子进程的可执行文件可能删除失败并抛出异常,异常信息为 Access is denied,如果遇到该问题,可以在一小段延迟后重新尝试删除该文件,详细实现可参考示例。

参数:

  • command: String - 指定子进程命令,command 不允许包含空字符。
  • arguments: Array<String> - 指定子进程参数,arguments 不允许数组中字符串中包含空字符。
  • workingDirectory!: ?Path - 命名可选参数,指定子进程的工作路径,默认继承当前进程工作路径,路径必须为存在的目录且不允许为空路径或包含空字符。
  • environment!: ?Map<String, String> - 命名可选参数,指定子进程环境变量,默认继承当前进程环境变量,key 不允许字符串中包含空字符或 '=',value 不允许字符串中包含空字符。
  • stdIn!: ProcessRedirect - 命名可选参数,指定子进程重定向标准输入,默认继承当前进程标准输入。
  • stdOut!: ProcessRedirect - 命名可选参数,指定子进程重定向标准输出,默认继承当前进程标准输出。
  • stdErr!: ProcessRedirect - 命名可选参数,指定子进程重定向标准错误,默认继承当前进程标准错误。
  • timeout!: ?Duration - 命名可选参数,指定等待子进程超时时间,默认为不超时, timeout 指定为 0 或负值时表示不超时。

返回值:

  • Int64 - 返回子进程退出状态,若子进程正常退出,返回子进程退出码,若子进程被信号杀死,返回导致子进程终止的信号编号。

异常:

  • IllegalArgumentException

    • 当入参 command 包含空字符
    • 或者 arguments 数组中字符串中包含空字符
    • 或者 workingDirectory 不是存在的目录或为空路径或包含空字符
    • 或者 environment 表中 key 字符串中包含空字符或 '='
    • 或者 value 字符串中包含空字符
    • 或者 stdInstdOutstdErr 输入为文件模式,输入的文件已被关闭或删除时,抛出异常。
  • ProcessException - 当内存分配失败或 command 对应的命令不存在或等待超时,抛出异常。

示例:

import std.process.*

main(): Int64 {
    // 执行简单命令并获取退出码
    let exitCode = execute("echo", ["Hello, World!"])
    println("退出码: ${exitCode}")
    return 0
}

运行结果:

Hello, World!
退出码: 0

func executeWithOutput(String, Array<String>, ?Path, ?Map<String, String>, ProcessRedirect, ProcessRedirect, ProcessRedirect)

public func executeWithOutput(
    command: String,
    arguments: Array<String>,
    workingDirectory!: ?Path = None,
    environment!: ?Map<String, String> = None,
    stdIn!: ProcessRedirect = Inherit,
    stdOut!: ProcessRedirect = Pipe,
    stdErr!: ProcessRedirect = Pipe
): (Int64, Array<Byte>, Array<Byte>)

功能:根据输入参数创建并运行一个子进程,等待该子进程运行完毕并返回子进程退出状态、标准输出和标准错误。输出流、错误流中包含大量输出的场景不适用于本函数,建议通过 SubProcess 中提供的标准流属性结合 wait 函数自行处理。

注意:

不支持平台:iOS。

参数:

  • command: String - 指定子进程命令,command 不允许包含空字符。
  • arguments: Array<String> - 指定子进程参数,arguments 不允许数组中字符串中包含空字符。
  • workingDirectory!: ?Path - 命名可选参数,指定子进程的工作路径,默认继承当前进程工作路径,路径必须为存在的目录且不允许为空路径或包含空字符。
  • environment!: ?Map<String, String> - 命名可选参数,指定子进程环境变量,默认继承当前进程环境变量,key 不允许字符串中包含空字符或 '=',value 不允许字符串中包含空字符。
  • stdIn!: ProcessRedirect - 命名可选参数,指定子进程重定向标准输入,默认继承当前进程标准输入。
  • stdOut!: ProcessRedirect - 命名可选参数,指定子进程重定向标准输出,默认继承当前进程标准输出。
  • stdErr!: ProcessRedirect - 命名可选参数,指定子进程重定向标准错误,默认继承当前进程标准错误。

返回值:

  • (Int64, Array<Byte>, Array<Byte>) - 子进程执行返回结果,包含子进程退出状态(若子进程正常退出,返回子进程退出码,若子进程被信号杀死,返回导致子进程终止的信号编号),进程标准输出结果和进程错误结果。

异常:

  • IllegalArgumentException
    • 当入参 command 包含空字符
    • 或者 arguments 数组中字符串中包含空字符
    • 或者 workingDirectory 不是存在的目录或为空路径或包含空字符
    • 或者 environment 表中 key 字符串中包含空字符或 '='
    • 或者 value 字符串中包含空字符
    • 或者 stdInstdOutstdErr 输入为文件模式,输入的文件已被关闭或删除时,抛出异常。
  • ProcessException
    • 当内存分配失败
    • 或者 command 对应的命令不存在
    • 或者子进程不存在
    • 或者标准流读取异常时,抛出异常。

示例:

import std.process.*

main(): Int64 {
    // 执行命令并捕获其输出
    let (exitCode, stdout, stderr) = executeWithOutput("echo", ["-n", "Hello, World!"])
    let stdoutStr = String.fromUtf8(stdout)
    let stderrStr = String.fromUtf8(stderr)
    println("退出码: ${exitCode}")
    println("标准输出: ${stdoutStr}")
    println("标准错误: ${stderrStr}")
    return 0
}

运行结果:

退出码: 0
标准输出: Hello, World!
标准错误: 

func findProcess(Int64)

public func findProcess(pid: Int64): Process

功能:根据输入进程 id 绑定一个进程实例。

注意:

iOS 平台上,传入非当前进程的 pid 会抛出异常。

参数:

  • pid: Int64 - 进程 id

返回值:

  • Process - 返回进程 id 对应的进程实例。

异常:

示例:

import std.process.*

main(): Int64 {
    // 获取当前进程ID
    let currentPid = Process.current.pid
    println("当前进程PID: ${currentPid}")

    // 根据PID查找进程
    let process = findProcess(currentPid)
    println("找到的进程PID: ${process.pid}")
    println("进程名称: ${process.name}")
    println("进程命令: ${process.command}")
    return 0
}

可能的运行结果:

当前进程PID: 72451
找到的进程PID: 72451
进程名称: main
进程命令: ./main

func launch(String, Array<String>, ?Path, ?Map<String, String>, ProcessRedirect, ProcessRedirect, ProcessRedirect)

public func launch(
    command: String,
    arguments: Array<String>,
    workingDirectory!: ?Path = None,
    environment!: ?Map<String, String> = None,
    stdIn!: ProcessRedirect = Inherit,
    stdOut!: ProcessRedirect = Inherit,
    stdErr!: ProcessRedirect = Inherit
): SubProcess

功能:根据输入参数创建并运行一个子进程,并返回一个子进程实例。调用该函数创建子进程后,需要调用 waitwaitOutput 函数,否则该子进程结束后成为的僵尸进程的资源不会被回收。

注意:

不支持平台:iOS。

参数:

  • command: String - 指定子进程命令,command 不允许包含空字符。
  • arguments: Array<String> - 指定子进程参数,arguments 不允许数组中字符串中包含空字符。
  • workingDirectory!: ?Path - 命名可选参数,指定子进程的工作路径,默认继承当前进程工作路径,路径必须为存在的目录且不允许为空路径或包含空字符。
  • environment!: ?Map<String, String> - 命名可选参数,指定子进程环境变量,默认继承当前进程环境变量,key 不允许字符串中包含空字符或 '=',value 不允许字符串中包含空字符。
  • stdIn!: ProcessRedirect - 命名可选参数,指定子进程重定向标准输入,默认继承当前进程标准输入。
  • stdOut!: ProcessRedirect - 命名可选参数,指定子进程重定向标准输出,默认继承当前进程标准输出。
  • stdErr!: ProcessRedirect - 命名可选参数,指定子进程重定向标准错误,默认继承当前进程标准错误。

返回值:

异常:

  • IllegalArgumentException
    • 当入参 command 包含空字符
    • 或者 arguments 数组中字符串中包含空字符
    • 或者 workingDirectory 不是存在的目录或为空路径或包含空字符
    • 或者 environment 表中 key 字符串中包含空字符或 '='
    • 或者 value 字符串中包含空字符
    • 或者 stdInstdOutstdErr 输入为文件模式,输入的文件已被关闭或删除时,抛出异常。
  • ProcessException - 当内存分配失败或 command 对应的命令不存在时,抛出异常。

示例:

import std.process.*

main(): Int64 {
    // 启动一个子进程
    let subprocess = launch("sleep", ["2s"])
    println("启动的进程PID: ${subprocess.pid}")
    println("进程名称: ${subprocess.name}")
    println("进程命令: ${subprocess.command}")

    // 等待进程完成
    let exitCode = subprocess.wait()
    println("进程退出码: ${exitCode}")
    return 0
}

运行结果:

启动的进程PID: 72451
进程名称: sleep
进程命令: sleep
进程退出码: 0