1. 程式人生 > >Unix系統編程()發送信號的其他方式:raise和killpg

Unix系統編程()發送信號的其他方式:raise和killpg

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