2011-03-29 149 views
3

我們一直在用C/Unix來講述信號,教授在課堂上舉了一個令我困惑的例子。在下面的主要方法中,使用包含的參數調用信號函數。信號處理程序問題

main() 
{ 
    signal(SIGALRM, handler); // install handler 

處理程序是定義爲static void handler(int param){

根據Ubuntu的man 7 signal功能,SIGALRM是一個整數值14,和處理程序是一個程序員定義的函數。但是,整數參數沒有在信號調用中明確定義,那麼處理程序如何接收參數?

編輯

感謝您的幫助。讓我感到沮喪的真正問題是,這個類沒有涉及typedef,所以我不知道它是如何被納入到函數中的,那是缺少的一塊。

回答

3

我不確定以前的評論是否回答了您的問題。我猜你在問這個參數如何到達信號處理程序。如果是這樣的話:

每個信號處理器必須具有相同的簽名。它被硬編碼到內核中,信號處理程序將採用一個int參數並且沒有返回值。你不告訴內核 - 通過signal() - 如何調用處理程序,因爲你在這件事上沒有選擇。當內核決定調用你的信號處理器時,它已經知道它想發送什麼信號。因此,它查找處理程序的地址,然後調用該函數,如

(*pointer_to_handler) (signal_number); 

正如Paul的答案所述。

+0

這就是我正在尋找的。 – Jason 2011-03-29 14:16:40

1

參數在signal()函數聲明中聲明。

manual page,它引用的聲明從<signal.h>

typedef void (*sighandler_t)(int); 

sighandler_t signal(int signum, sighandler_t handler); 
2

您可以使用多個信號相同的處理函數,所以處理程序傳遞的信號值(例如你的情況SIGALRM = 14) 。

關於處理程序參數,它明確地在signal簽名定義:

typedef void (*sighandler_t)(int); 

sighandler_t signal(int signum, sighandler_t handler); 
+0

好的,所以sighandler是一個指向signum的整數指針,在這種情況下是SIGALRM? – Jason 2011-03-29 14:04:36

+2

sighandler是一個指向一個函數的指針,它將一個整數作爲參數並返回void。 – 2011-03-29 14:54:05

0

(在你的代碼param)有關的參數是信號編號(SIGALRM)。這不是一個額外的參數。

1

該處理器將被調用是這樣的:

 
    (*pointer_to_handler) (param); 

的「處理」傳遞給信號僅僅是一個函數指針,而不是一個電話。它稍後調用。