天天看點

Unix系統程式設計()發送信号kill

與shell的kill指令類似,一個程序能夠使用kill系統調用向另一程序發送信号。

之是以選擇kill作為術語,因為早期UNIX實作中大多數信号的預設行為是終止程序。

#include <signal.h>

int kill(pid_t pid, int sig);

pid參數辨別一個或多個目标程序,而sig則指定了要發送的信号。如何解釋pid,要視以下4中情況而定。

如果pid大于0,那麼會發送信号給由pid指定的程序。

如果pid等于0,那麼會發送信号給與調用程序同組的每個程序,包括調用程序自身。

如果pid小于-1,那麼會向組ID等于該pid絕對值的程序組内所有下屬程序發送信号。向一個程序組的所有程序發送信号在shell作業控制中有特殊的用途。

如果pid等于-1,那麼信号的發送範圍是:調用程序有權将信号發往的每個目标程序,除去init(程序ID為1)和調用程序自身。如果特權級程序發起這一調用,那麼會發送信号給系統中的所有程序,上述兩個程序除外。顯而易見,有時也将這種信号發送方式稱之為廣播信号。

如果并無程序與指定的pid相比對,那麼kill調用失敗,同時将errno設定為ESRCH("查無此程序")。

程序要發送信号給另一程序,還需要适當的權限,其權限規則如下。

特權級(CAP_KILL)程序可以向任何程序發送信号。

以root使用者群組運作的init程序(程序号為1),是一種特例,僅能接受已安裝了處理器函數的信号。這可以防止系統管理者意外殺死init 程序——這一系統運作的基石。

如果所示,如果發送者的實際或有效使用者ID比對于接受者的實際使用者ID或者儲存設定使用者ID(saved set-user-id),那麼非特權程序也可以向另一程序發送信号。利用這一規則,使用者可以向由他們啟動的set-user-ID程式發送信号,而無需考慮目标程序有效使用者ID的目前設定。将目标程序有效使用者ID排除在檢查範圍之外,這一舉措的輔助作用在于防止使用者某甲向使用者某乙的程序發送信号,而該程序正在執行的set-user-ID程式又屬于使用者某甲。

SIGCONT信号需要特殊處理。無論對使用者ID的檢查結果如何,非特權程序可以向同一會話中的任何其他程序發送這一信号。利用這一規則,運作作業控制的shell可以重新開機已停止的作業(程序組),即使作業程序已經修改了它們的使用者ID。

如果程序無權發送信号給所請求的pid,那麼kill調用将失敗,且将errno置為EPERM。若pid所指為一系列程序(即pid是負值)時,隻要向其中之一發送信号,則kill調用成功。

轉載于:https://www.cnblogs.com/tuhooo/p/8677719.html