kill() - Unix,Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考资料
  Unix 有用资源
  精选读物

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论论坛     关于 TP  

kill() - Unix,Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

kill - 向进程发送信号

概要

#include <sys/types.h> 

#include <signal.h>

int kill(pid_t pid, int sig);

描述

kill() 系统调用可用于向任何进程组或进程发送任何信号。

如果pid为正数,则信号sig将发送到pid

如果pid等于 0,则sig将发送到当前进程的进程组中的每个进程。

如果pid等于 -1,则sig将发送到调用进程有权发送信号的每个进程,但进程 1 (init) 除外,但请参见下文。

如果pid小于 -1,则sig将发送到进程组-pid中的每个进程。

如果sig为 0,则不会发送任何信号,但仍会执行错误检查。

要使进程有权发送信号,它必须具有特权(在 Linux 下:具有CAP_KILL功能),或者发送进程的真实或有效用户 ID 必须等于目标进程的真实或已保存的 set-user-ID。对于 SIGCONT,当发送进程和接收进程属于同一个会话时就足够了。

返回值

成功(至少发送了一个信号)时,返回零。出错时,返回 -1,并相应设置errno

错误

标签描述
EINVAL 指定了无效信号。
EPERM 该进程无权向任何目标进程发送信号。
ESRCH pid 或进程组不存在。请注意,现有进程可能是僵尸进程,即已提交终止但尚未wait()的进程。

备注

唯一可以发送到任务编号 1(init进程)的信号是init已明确为此安装信号处理程序的那些信号。这样做是为了确保系统不会意外地崩溃。

POSIX.1-2001 要求kill(-1,sig)sig发送到当前进程可以向其发送信号的所有进程,但一些实现定义的系统进程除外。Linux 允许进程向自身发送信号,但在 Linux 上,kill(-1,sig)调用不会向当前进程发送信号。

POSIX.1-2001 要求如果进程向自身发送信号,并且发送线程未阻止该信号,并且没有其他线程将其取消阻止或在sigwait()中等待它,则在kill()之前,必须至少将一个未阻止的信号传递给发送线程。

缺陷

在 2.6 内核(包括 2.6.7)中,存在一个缺陷,这意味着当向进程组发送信号时,如果调用者有权向进程组的任何(而不是所有)成员发送信号,则kill()将以错误EPERM失败。尽管返回此错误,信号仍然传递给调用者有权发送信号的所有进程。

Linux 历史

在不同的内核版本中,Linux 对非特权进程向其他进程发送信号所需权限的规则进行了不同的强制执行。在 1.0 到 1.2.2 内核中,如果发送者的有效用户 ID 与接收者的有效用户 ID 匹配,或者发送者的真实用户 ID 与接收者的真实用户 ID 匹配,则可以发送信号。从 1.2.3 内核到 1.3.77 内核,如果发送者的有效用户 ID 与接收者的真实或有效用户 ID 匹配,则可以发送信号。在 1.3.78 内核中采用了符合 POSIX.1-2001 的当前规则。

符合标准

SVr4、4.3BSD、POSIX.1-2001

参见



previous next Printer Friendly

广告


  

广告



广告