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

廣告


  

廣告



廣告