kill(2) - Linux man page
名称
kill - 向进程发送信号
概要
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);glibc 的功能测试宏要求(参见 feature_test_macros(7))
- kill(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
描述
kill() 系统调用可用于向任何进程组或进程发送任何信号。
如果 pid 是正数,则信号 sig 将被发送到 ID 为 pid 指定的进程。
如果 pid 等于 0,则 sig 将被发送到调用进程的进程组中的每个进程。
如果 pid 等于 -1,则 sig 将被发送到调用进程有权发送信号的每个进程,但进程 1 (init) 除外,具体如下所述。
如果 pid 小于 -1,则 sig 将被发送到进程组中的每个进程,其 ID 为 -pid。
如果 sig 为 0,则不发送任何信号,但仍会执行错误检查;这可用于检查进程 ID 或进程组 ID 是否存在。
为了使进程有权发送信号,它必须是特权进程(在 Linux 下:具有 CAP_KILL 功能),或者发送进程的实际或有效用户 ID 必须等于目标进程的实际或保存的设置用户 ID。对于 SIGCONT,当发送和接收进程属于同一会话时就足够了。
返回值
如果成功(至少发送了一个信号),则返回零。如果发生错误,则返回 -1,并且 errno 将被相应地设置。
错误
- EINVAL
指定了无效的信号。
EPERM
该进程没有权限向任何目标进程发送信号。
ESRCH
pid 或进程组不存在。请注意,现有的进程可能是僵尸进程,即已经提交终止但尚未被 wait(2) 的进程。
符合
SVr4, 4.3BSD, POSIX.1-2001。
说明
只能向进程 ID 1,即 init 进程发送 init 显式安装了信号处理程序的那些信号。这样做是为了确保系统不会意外崩溃。
POSIX.1-2001 要求 kill(-1,sig) 将 sig 发送到调用进程可以发送信号的所有进程,可能除了某些特定于实现的系统进程。Linux 允许进程向自身发送信号,但在 Linux 上,调用 kill(-1,sig) 不会向调用进程发送信号。
POSIX.1-2001 要求,如果进程向自身发送信号,并且发送线程未阻止该信号,并且没有其他线程已取消阻止该信号或在 sigwait(3) 中等待该信号,则至少一个未阻止的信号必须传递到发送线程,然后 kill() 才会返回。
Linux 注意
- 在不同的内核版本中,Linux 强制执行不同的规则,用于非特权进程向另一个进程发送信号所需的权限。在内核 1.0 到 1.2.2 中,如果发送者的有效用户 ID 与接收者的有效用户 ID 匹配,或者发送者的实际用户 ID 与接收者的实际用户 ID 匹配,则可以发送信号。从内核 1.2.3 到 1.3.77,如果发送者的有效用户 ID 与接收者的实际或有效用户 ID 匹配,则可以发送信号。当前规则符合 POSIX.1-2001,于内核 1.3.78 采用。
错误
在 2.6 内核中,直到包括 2.6.7 为止,存在一个错误,即当向进程组发送信号时,如果调用者没有权限向进程组的任何(而不是全部)成员发送信号,则 kill() 会以 EPERM 错误失败。尽管返回此错误,但信号仍然会传递到调用者有权向其发送信号的所有进程。
参见
_exit(2), killpg(2), signal(2), tkill(2), exit(3), sigqueue(3), capabilities(7), credentials(7), signal(7)