2011-02-25 86 views
8
struct sigaction psa; 

我已經啓用的主要功能我的信號處理程序,如下圖所示:啓用信號處理程序

memset (&psa, 0, sizeof (psa)); 
    psa.sa_handler = pSigHandler; 
    sigaction (SIGALRM, &psa, NULL); 
    sigaction(SIGVTALRM, &psa, NULL); 
    sigaction(SIGPROF, &psa, NULL); 

我的信號處理程序是這樣的:

static void pSigHandler(int signo){ 
    printf("Pareint signum: %d", signo);// debug 
    switch (signo) { 
     case SIGALRM: 
      printf("P SIGALRM handler");//debug 
      break; 
     case SIGVTALRM: 
      printf("P SIGVTALRM handler");//debug 
      break; 
     case SIGPROF: 
      printf("P SIGPROF handler");//debug 
      break; 
     default: /*Should never get this case*/ 
      break; 
    } 
    return; 
} 

現在我的問題對某些人來說可能很明顯,爲什麼我在運行時沒有看到打印的調試行?事實上,沒有印刷任何東西。非常感謝你幫助我理解這一點。我在Linux上運行它,使用Eclipse進行編程。

回答

10
#include <stdio.h> 
#include <signal.h> 

static void pSigHandler(int signo){ 
    switch (signo) { 
      case SIGTSTP: 
      printf("TSTP"); 
      fflush(stdout); 
      break; 
    } 
} 

int main(void) 
{ 
    struct sigaction psa; 
    psa.sa_handler = pSigHandler; 
    sigaction(SIGTSTP, &psa, NULL); 
    for(;;) {} 
    return 0; 
} 

因爲你需要fflush(標準輸出)

嘗試使用C-Z

我甚至不知道這是否是安全的信號處理程序使用標準輸入輸出,雖然。

更新:http://bytes.com/topic/c/answers/440109-signal-handler-sigsegv

根據該鏈接,你不應該這樣做。

+0

我試圖添加在fflush(標準輸出);仍然沒有打印出任何東西, 我在我的程序中註釋了其他代碼,所以它看起來與上面幾乎相同,只是沒有無限循環。有任何想法嗎?謝謝湯姆。 – txs 2011-02-25 04:44:19

+0

在我的代碼示例中,fflush使打印與否之間存在差異。我想也許應用程序沒有得到你的信號?你有沒有試過我的?我認爲這可能是未定義的行爲,我放在底部的鏈接有一些信息,說明你只能在那裏做某些事情......它應該在你係統的文檔中。 – 2011-02-25 04:50:19

+0

你也提到你刪除了無限循環---如果不存在,代碼將退出並且信號處理程序將會消失......您需要阻止並等待信號... – 2011-02-25 04:52:37