libuv - `uv_kill` 和 `uv_process_kill` 有什么区别?

libuv - What is the difference between `uv_kill` and `uv_process_kill`?

int uv_process_kill(uv_process_t* handle, int signum)

Sends the specified signal to the given process handle. Check the documentation on uv_signal_t — Signal handle for signal support, specially on Windows.

int uv_kill(int pid, int signum)

Sends the specified signal to the given PID. Check the documentation on uv_signal_t — Signal handle for signal support, specially on Windows.

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

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

查看来源 (here and here)。 uv_process_killuv_kill 做同样的事情。

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 但您没有的进程时使用正确初始化的 uv_process_t.