2011-02-25 105 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