【问题标题】:libuv - What is the difference between `uv_kill` and `uv_process_kill`?libuv - `uv_kill` 和 `uv_process_kill` 有什么区别?
【发布时间】:2017-04-10 04:17:52
【问题描述】:

int uv_process_kill(uv_process_t* handle, int signum)

将指定的信号发送到给定的进程句柄。查看有关 uv_signal_t 的文档——信号句柄以获得信号支持,特别是在 Windows 上。

int uv_kill(int pid, int signum)

将指定的信号发送到给定的 PID。查看有关 uv_signal_t 的文档——信号句柄以获得信号支持,特别是在 Windows 上。

这两种方式是完全相同的,还是库内部的机制有什么不同?我需要处理我的 UV 循环可能无法运行(无论出于何种原因)的错误情况,但我已经为我希望生成的所有进程调用了 uv_spawn

我的目标是清理分配给子进程的资源,而不需要知道 uv 循环是否正在运行、停止或处于错误状态。

【问题讨论】:

    标签: c process libuv


    【解决方案1】:

    uv_process_killuv_kill 执行相同的操作,但由于界面不同,它们彼此不同。前者接受 uv_process_t 句柄,而后者明确需要 pid(两者都有第二个参数,即信号编号)。
    值得注意的是,结构 uv_process_t(您可以与 uv_process_kill 一起使用)有一个名为 pid 的字段(您可以与 uv_kill 一起使用),因此有人可能会认为这两个函数是多余的。
    无论如何,要被杀死的进程的 pid 可能会因为外部源而出现(例如,用户可以通过命令行提供它 - 想想 kill 工具适用于 Linux)。因此,当您有一个 pid 时,不能保证您有一个 uv_process_t 的实例,而且不用说这两个函数的用途略有不同。
    当然,当您有uv_process_t 的实例时,您仍然可以使用uv_kill

    uv_kill(proc.pid);
    

    无论如何,这不是 libuv 的工作方式,当你拥有它们时,你应该使用接受 uv_* 数据结构的函数,因为它们知道如何正确地拆除所有东西。

    总而言之,您可以将uv_process_kill 视为一个更面向 libuv 的函数,当您负责进程的整个生命周期时使用(生成它并在需要时将其杀死)。另一方面,uv_kill 是一个更通用的函数,当您想要处理您知道 pid 但没有正确初始化的@987654335 的进程时使用@。

    【讨论】:

      【解决方案2】:

      查看源代码(herehere)。 uv_process_killuv_kill 做同样的事情。

      【讨论】:

      • 去掉“类型 uv_process_t 中有一个成员 uv_process_t.pid。”,并提供一个指向源的链接(你在你的答案中引用),我会给你复选标记。跨度>
      猜你喜欢
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      • 2013-08-19
      相关资源
      最近更新 更多