GioSubprocess

自:2.40

描述 [src]

final class Gio.Subprocess : GObject.Object
  implements Gio.Initable {
  /* No available fields */
}

GSubprocess 允许创建与子进程的交互。

可以使用标准的 GIO 风格的 API(例如:GInputStreamGOutputStream)与进程进行通信。还有 GIO 风格的 API 来等待进程终止(例如:可取消的并具有异步变体)。

有一个用于强制终止进程的 API,以及向子进程发送 UNIX 信号的无竞态条件 API

相对于核心 GLib 库,GIO 带来的一个主要优势是全面的异步 I/O API,如 g_output_stream_splice_async()。这使得 GSubprocess 相比于其他一些语言的等效 API(如 Python 中包含的 subprocess.py)更加强大和灵活。例如,使用 GSubprocess,可以创建两个子进程,从第一个读取标准输出,对其进行处理,并将数据写入第二个的输入流,而无需阻塞主循环。

提供了与 g_subprocess_communicate() 类似的强大 API,类似于 subprocess.py 中的 communicate() 方法。这使得与使用管道打开的子进程的交互变得非常简单。

GSubprocess 默认对在子进程中打开的文件描述符有紧密控制,避免由简单的 fork()/exec() 导致的悬挂文件描述符(FD)问题。在子进程中打开的唯一文件描述符是那些由 GSubprocess API 明确指定的(除非指定了 G_SUBPROCESS_FLAGS_INHERIT_FDS)。

GSubprocess 将迅速终止所有退出的子进程,避免“僵尸进程”长时间存在。可以使用 g_subprocess_wait() 来等待此事件发生,但即使在未显式调用的情况下,它也会发生。

从原则上讲,GSubprocess 没有接受壳式空格分隔字符串的API。然而,它将匹配典型的shell行为,在不含路径分隔符的名称中搜索可执行文件。默认情况下,当前进程的PATH会被使用。你可以指定 G_SUBPROCESS_FLAGS_SEARCH_PATH_FROM_ENVP 来使用启动环境的 PATH

GSubprocess 尝试为大多数使用情况拥有一个非常简单的 API(即:带有参数启动子进程并支持大部分典型的输入和输出重定向)。请参阅 g_subprocess_new()。为更复杂的情况(高级类型的重定向、环境变量操作、工作目录更改、子进程设置函数等)提供了 GSubprocessLauncher API

典型的 GSubprocess 使用包括调用 g_subprocess_new(),然后是 g_subprocess_wait_async()g_subprocess_wait()。进程退出后,可以使用如 g_subprocess_get_if_exited()(与熟悉的 WIFEXITED-风格 POSIX 宏相似)之类的函数来检查状态。

请注意,从 GLib 2.82 开始,创建一个 GSubprocess 使程序剩余部分忽略 SIGPIPE 信号。如果你正在编写使用 GSubprocess 的命令行工具,你可能需要考虑这样一个事实:如果你的程序在关闭后尝试写入 stdout,它不会被自动终止。

自 2.40 版本起可用

祖先

实现

构造函数

g_subprocess_new

使用指定的标志和 varargs 参数列表创建一个新进程。默认情况下,匹配 g_spawn_async() 的默认值,子进程的 stdin将被设置为系统空设备,而 stdout/stderr 将从父进程继承。你可以使用 flags 来控制此行为。

自:2.40

g_subprocess_newv

使用指定的标志和参数列表创建一个新进程。

自:2.40

实例方法

g_subprocess_communicate

与子进程通信,直到它终止,所有输入和输出都已完成。

自:2.40

g_subprocess_communicate_async

g_subprocess_communicate() 的异步版本。使用 g_subprocess_communicate_finish() 完成。

g_subprocess_communicate_finish

完成 g_subprocess_communicate_async() 的调用。

g_subprocess_communicate_utf8

和 g_subprocess_communicate() 类似,但验证进程的输出为 UTF-8,并以常规 NUL 终止的字符串返回。

g_subprocess_communicate_utf8_async

g_subprocess_communicate_utf8() 的异步版本。使用 g_subprocess_communicate_utf8_finish() 完成。

g_subprocess_communicate_utf8_finish

完成 g_subprocess_communicate_utf8_async() 的调用。

g_subprocess_force_exit

使用操作系统的特定方法尝试立即、强制地终止进程。没有机制来确定请求本身是否成功;然而,你可以使用 g_subprocess_wait() 来在调用此函数后监控进程的状态。

自:2.40

g_subprocess_get_exit_status

检查子进程的退出状态,假设它已正常退出。这是传递给 exit() 系统调用的值或 main 的返回值。

自:2.40

g_subprocess_get_identifier

UNIX 上,返回进程的 ID 作为十进制字符串。在 Windows 上,返回 GetProcessId() 的结果,同样以字符串形式。如果子进程已终止,则此函数返回 NULL

自:2.40

g_subprocess_get_if_exited

检查指定的子进程是否正常退出(即:通过exit()或main()返回)。

自:2.40

g_subprocess_get_if_signaled

检查给定的子进程是否因信号而终止。

自:2.40

g_subprocess_get_status

获取过程的原始状态代码,类似于waitpid()。

自:2.40

g_subprocess_get_stderr_pipe

获取用于读取subprocess的stderr输出的GInputStream

自:2.40

g_subprocess_get_stdin_pipe

获取您可以写入以向subprocess的stdin提供数据的GOutputStream

自:2.40

g_subprocess_get_stdout_pipe

获取用于读取subprocess的stdout输出的GInputStream

自:2.40

g_subprocess_get_successful

检查进程是否“成功”。一个进程被认为是成功的,如果它以0的状态代码干净地退出,无论是通过exit()系统调用还是main()返回。

自:2.40

g_subprocess_get_term_sig

获取导致子进程终止的信号编号,假设它是由于信号而终止的。

自:2.40

g_subprocess_send_signal

如果子进程仍然在运行,则向子进程发送UNIX信号signal_num

自:2.40

g_subprocess_wait

同步等待子进程终止。

自:2.40

g_subprocess_wait_async

等待子进程终止。

自:2.40

g_subprocess_wait_check

g_subprocess_wait()与g_spawn_check_wait_status()结合。

自:2.40

g_subprocess_wait_check_async

g_subprocess_wait_async()与g_spawn_check_wait_status()结合。

自:2.40

g_subprocess_wait_check_finish

收集先前对g_subprocess_wait_check_async()的调用结果。

自:2.40

g_subprocess_wait_finish

收集先前对g_subprocess_wait_async()的调用结果。

自:2.40

GObject继承的方法(43)

请参阅GObject以获取方法列表的完整列表。

GInitable继承的方法(1)
g_initable_init

初始化实现接口的对象。

since: 2.22

属性

Gio.Subprocess:argv

参数向量。

自:2.40

Gio.Subprocess:flags

子进程标志。

自:2.40

信号

GObject继承的信号(1)
GObject::notify

当对象的一个属性值通过g_object_set_property()、g_object_set()等方法设置时,发出notify信号。