kill函數將信號發送給進程或進程組。raise函數則允許進程向自身發送信號。
#include <signal.h>int kill(pid_t pid, int signo);int raise(int signo);兩個函數返回值:若成功則返回0,若出錯則返回-1
調用
raise(signo);
等價于調用
kill(getpid(), signo);
kill的pid參數有4種不同的情況:
pid > 0 將該信號發送給進程ID為pid的進程。
pid == 0 將該信號發送給與發送進程屬于同一進程組的所有進程(這些進程的進程組ID等于發送進程的進程組ID),而且發送進程具有向這些進程發送信號的權限。注意,這里用的術語“所有進程”不包括實現定義的系統進程集。對于大多數UNIX系統,系統進程集包括內核進程以及init(pid 1)。
pid < 0 將信號發送給其進程組ID等于pid的絕對值的進程組中的所有進程,而且發送進程具有向其發送信號的權限。如上所述,“所有進程”不包括某些系統進程。
pid == –1 將該信號發送給發送進程有權限向它們發送信號的系統上的所有進程。如上所述,“所有進程”不包括某些系統進程。
進程將信號發送給其他進程需要權限:
超級用戶可將信號發送給任一進程。
對于非超級用戶,其基本規則是發送者的實際或有效用戶ID必須等于接收者的實際或有效用戶ID。如果實現支持_POSIX_SAVED_IDS,則檢查接收者的保存的設置用戶ID(而不是其有效用戶ID)。在對權限進行測試時也有一個特例:如果被發送的信號是SIGCONT,則進程可將它發送給屬于同一會話的任何其他進程。
POSIX.1將編號為0的信號定義為空信號。如果signo參數是0,則kill仍執行正常的錯誤檢查,但不發送信號。這常被用來確定一個特定進程是否仍舊存在。如果向一個并不存在的進程發送空信號,則kill返回-1,并將errno設置為ESRCH。但是,應當了解,UNIX系統在經過一段時間后會重新使用進程ID,所以一個現有的具有所給定進程ID的進程并不一定就是你想要的進程。
還應該理解的是,對于進程是否存在的這種測試不是原子操作。在kill向調用者返回測試結果時,原來存在的被測試進程此時可能已經終止,所以這種測試并無多大價值。
如果調用kill為調用進程產生信號,而且此信號是不被阻塞的,那么在kill返回之前,就會將signo或者某個其他未決的非阻塞信號傳送至該進程。(對于線程而言,還有一些附加條件)。
本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
新聞熱點
疑難解答