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)

引用自

clone(2), cpuset(7), exit(2), explain(1), explain(3), explain_kill(3), explain_kill_or_die(3), fcntl(2), fuser(1), getpid(2), getrlimit(2), kill(1), killall(1), killpg(3), objcmdwrite(3), pause(2), perlfunc(1), pgrep(1), psignal(3), pth(3), pthread_kill(3), pthreads(7), ptrace(2), raise(3), rt_sigqueueinfo(2), setfsgid(2), setfsuid(2), shellout(3), sigaction(2), sigblock(2), sigpause(2), sigpause(3), sigpending(2), sigprocmask(2), sigqueue(2), sigreturn(2), sigset(3), sigsuspend(2), sigtimedwait(2), sigvec(3), skill(1), ssignal(3), strace(1), tgkill(2)