类
GioSubprocess
自:2.40
描述 [src]
final class Gio.Subprocess : GObject.Object
implements Gio.Initable {
/* No available fields */
}
GSubprocess
允许创建与子进程的交互。
可以使用标准的 GIO 风格的 API(例如:GInputStream
、GOutputStream
)与进程进行通信。还有 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_communicate_async
g_subprocess_communicate() 的异步版本。使用 g_subprocess_communicate_finish() 完成。
g_subprocess_communicate_utf8_async
g_subprocess_communicate_utf8() 的异步版本。使用 g_subprocess_communicate_utf8_finish() 完成。
g_subprocess_force_exit
使用操作系统的特定方法尝试立即、强制地终止进程。没有机制来确定请求本身是否成功;然而,你可以使用 g_subprocess_wait()
来在调用此函数后监控进程的状态。
自:2.40
g_subprocess_get_identifier
在 UNIX 上,返回进程的 ID 作为十进制字符串。在 Windows 上,返回 GetProcessId() 的结果,同样以字符串形式。如果子进程已终止,则此函数返回 NULL
。
自:2.40
g_subprocess_get_successful
检查进程是否“成功”。一个进程被认为是成功的,如果它以0的状态代码干净地退出,无论是通过exit()
系统调用还是main()返回。
自:2.40
从GInitable继承的方法(1)
信号
从GObject继承的信号(1)
GObject::notify
当对象的一个属性值通过g_object_set_property()、g_object_set()等方法设置时,发出notify信号。