信號處理程序必須處理重入問題和其他問題。在實踐中,屏蔽信號然後不時檢索它們通常更方便。您可以使用此屏蔽所有信號(除了SIGSTOP
和SIGKILL
,你不能無論如何處理):
sigset_t all_signals;
sigfillset(&all_signals);
sigprocmask(SIG_BLOCK, &all_signals, NULL);
代碼略有不同,如果你使用的並行線程。
sigset_t all_signals;
sigfillset(&all_signals);
pthread_sigmask(SIG_BLOCK, &all_signals, NULL);
一旦你這樣做,你應該定期調用sigtimedwait(2)
這樣的:
struct timespec no_time = {0, 0};
siginfo_t result;
int rc = sigtimedwait(&all_signals, &result, &no_time);
如果您創建的任何其他人之前在每一個線程在主線程中調用該方法,或(最好)有一個待處理的信號,關於它的信息將被放在result
和rc
之間的信號編號;如果不是,則rc
將是-1並且errno
將是EAGAIN
。如果您已撥打select(2)
/poll(2)
(例如,作爲某些事件驅動系統的一部分),則可能需要創建signalfd(2)
,並將其附加到事件循環中。在這種情況下,您仍然需要如上所示屏蔽信號。
在'for'循環中,從1到31? –
每個系統都有一個信號列表。參見'/ usr/include/signal.h'沒有一個標準的宏可以用來表示所有的宏。加。例如,你不能捕獲所有的「SIGKILL」。 –
是的,我已經提到過。但是在一些現代操作系統上有超過32個。例如,在FreeBSD上kill -l會返回126個條目。 – kober