簡體   English   中英

信號處理問題

[英]Signal handler question

我們一直在用C / Unix覆蓋信號,教授在課堂上舉了一個令我困惑的例子。 在下面的主要方法中,使用包含的參數調用信號函數。

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

handler是一個定義為static void handler(int param){

根據Ubuntu man 7 signal ,SIGALRM是一個整數值14,而handler是一個程序員定義的函數。 但是,在信號調用中沒有顯式定義整數參數,那么處理程序如何接收參數?

編輯

謝謝您的幫助。 絆倒我的真正問題是該類沒有覆蓋typedef,所以我不知道它是如何被合並到函數中的,這就是缺少的部分。

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

每個信號處理程序必須具有相同的簽名。 它被硬編碼到內核中,信號處理程序將采用單個int參數並且沒有返回值。 你不告訴內核 - 通過signal() - 如何調用處理程序,因為你沒有選擇。 當內核決定調用你的信號處理程序時,它已經知道它想要發送什么信號。 所以它查找處理程序的地址,然后調用該函數

(*pointer_to_handler) (signal_number);

正如保羅的回答所說的那樣。

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

關於handler參數,它在signal的簽名中明確定義:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

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

參見手冊頁 ,它引用了<signal.h>的聲明:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler); 

處理程序將被調用如下:

(*pointer_to_handler) (param);

傳遞給signal的'handler'只是一個函數指針,而不是一個調用。 它稍后被稱為。

有問題的參數(代碼中的param )是信號編號( SIGALRM )。 這不是一個額外的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM