Unix系統編程()發送信號的其他方式:raise和killpg
阿新 • • 發佈:2018-03-30
self AD HR blog xxxx 這一 val 因此 ise
有時,進程需要向自身發送信號,raise 函數就執行了這一任務。
#include <signal.h>
int raise(int sig);
在單線程程序中,調用raise相當於對kill的如下調用:
kill(getpid(), sig);
支持線程的系統會將raise(sig)實現為:
pthread_kill(pthread_self(), sig)
後面會描述pthread_kill函數,但目前僅需要了解一點就已足夠,該實現意味著將信號傳遞給調用raise的特定線程。相比之下,kill(getpid(), sig)調用會發送一個信號給調用進程,並可將該信號傳遞給該進程的任一線程。
raise函數起源於C89。C語言標準不包含諸如進程ID之類的操作系統細節,raise函數之所以得以定義,是因為該函數不需要引用進程ID。
當進程使用raise後者kill向自身發送信號時,信號將立即傳遞(即,在raise返回調用者之前)。
註意,raise出錯將返回非0值(不一定為-1)。調用raise唯一可能發生的錯誤為EINVAL,即sig無效。因此,在任何指定了某一SIGxxxx常量的位置,都未檢查該函數的返回狀態。
killpg調用相當於對kill的如下調用
kill(-pgrp, sig);
如果指定pgrp的值為0,那麽會向調用者所屬進程的所有進程發送此信號。SUSv3對此未做規範,但大多數UNIX實現對該情況的處理與Linux相同。
Unix系統編程()發送信號的其他方式:raise和killpg