函数
GLibchild_watch_source_new
自 2.4 起
声明 [src]
GSource*
g_child_watch_source_new (
GPid pid
)
描述 [src]
创建一个新的 child_watch 来源。
此来源最初不会与任何 GMainContext
联系,并且必须在使用 g_source_attach()
将其添加到其中后才会执行。
请注意,仅当使用 G_SPAWN_DO_NOT_REAP_CHILD
标志时,才能将子监视来源与 g_spawn...
结合使用。
请注意,在必须显式关闭 GPid
的平台上(参见 g_spawn_close_pid()
),当来源仍然处于活动状态时,不得关闭 pid
。通常,您需要在来源的回调函数中调用 g_spawn_close_pid()
。
在 POSIX 平台上,由于 POSIX 进程接口的限制,以下限制适用于此 API:
pid
必须是该进程的子进程pid
必须为正数- 应用程序不得使用非正数作为第一个参数来调用
waitpid
,例如,在另一个线程中 - 应用程序不得通过任何其他机制等待
pid
退出,包括waitpid(pid, ...)
或针对同一pid
的第二个子监视来源 - 应用程序不得忽略
SIGCHLD
- 在 2.78 之前,应用程序不能以无竞争的方式向受监视的
pid
发送信号(kill()
)。自 2.78 起,当相关GMainContext
被获取时,您可以这样做。 - 在 2.78 之前,即使在销毁
GSource
之后,您也无法确定pid
是否尚未回收。因此,在子监视来源消失后kill()
或waitpid()
进程 ID 也不安全。在来源触发之前销毁它使得可靠回收进程变得不可能。
如果不满足任何这些条件,那么此功能和相关 API 将无法正常工作。这通常可以通过一个 GLib 警告进行诊断,指出 waitpid
接收到了 ECHILD
。
针对 pid
以外的特定进程调用 waitpid
仍然是有效的操作。
自 2.4 起提供
参数
pid
-
类型:
GPid
要监视的进程。在 POSIX 上为子进程的正 pid。在 Windows 上为进程的句柄(不必是子进程)。
返回值
类型: GSource
新创建的子监视来源。
函数的调用方将拥有这些数据的权限,并且负责释放它们。 |