KILL - Linux手册页
Linux程序员手册 第2部分
更新日期: 2019-10-10
名称
kill-向进程发送信号
语法
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
kill():_ POSIX_C_SOURCE
说明
kill()系统调用可用于将任何信号发送到任何进程组或进程。
如果pid为正,则信号sig将以pid指定的ID发送到进程。
如果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
- 目标进程或进程组不存在。请注意,现有进程可能是僵尸进程,即已终止执行但尚未等待的进程。
遵循规范
POSIX.1-2001,POSIX.1-2008,SVr4、4.3BSD。
备注
可以发送到进程ID 1(初始化进程)的唯一信号是init已为其明确安装了信号处理程序的信号。这样做是为了确保不会意外关闭系统。
POSIX.1要求kill(-1,sig)向调用进程可能向其发送信号的所有进程发送sig,某些实现定义的系统进程可能除外。 Linux允许进程发信号通知自己,但是在Linux上,调用kill(-1,sig)不会发信号通知调用进程。
POSIX.1要求,如果一个进程向其自身发送信号,并且发送线程没有将该信号阻塞,并且在sigwait(3)中没有其他线程对该信号进行阻塞或等待,则必须至少有一个阻塞信号在kill()返回之前传递到发送线程。
Linux notes
在不同的内核版本中,Linux对非特权进程向另一个进程发送信号所需的权限实施了不同的规则。在内核1.0到1.2.2中,如果发件人的有效用户ID与目标的有效用户ID相匹配,或者发件人的真实用户ID与目标的真实用户ID相匹配,则可以发送信号。从内核1.2.3到1.3.77,如果发送方的有效用户ID与目标的实际或有效用户ID相匹配,则可以发送信号。符合POSIX.1的当前规则已在内核1.3.78中采用。
BUGS
在2.6.7及以下版本的2.6内核中,存在一个错误,该错误意味着在将信号发送到进程组时,如果调用者无权将信号发送给任何人(而不是将信号发送给进程组,则kill()失败,错误EPERM)。全部)的成员。尽管返回了此错误,但信号仍然传递到调用者允许发出信号的所有进程。
另外参见
kill(1),_ exit(2),pidfd_send_signal(2),signal(2),tkill(2),exit(3),killpg(3),sigqueue(3),功能(7),凭据(7),信号(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。