函数

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

新创建的子监视来源。

函数的调用方将拥有这些数据的权限,并且负责释放它们。