为什么我们两次调用Signal Handler?

时间:2013-12-28 08:06:16

标签: c linux signals signal-processing

我是使用c语言进行信号处理的新手。我正在分析从特定资源中提取的信号处理代码。

这是代码。

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

    void intproc();
    void quitproc();

    main()
    {
      int i;

      signal(SIGINT,intproc);
      signal(SIGQUIT,quitproc);

      printf("Ctrl+c is disabled. Use ctrl+\\ to quit\n");

      for (i=0;;i++) {
        printf("In an infinite loop...\n"); 
        sleep(200);
        }
    }


    void intproc()
    {
      signal(SIGINT,intproc);
      printf("You have pressed ctrl+c.\n");
    }

    void quitproc()
    { signal(SIGQUIT,intproc);
      printf("You have pressed ctrl+\\. Now the program quits.\n");
      exit(0);
    }

我想知道的是为什么我们再次调用信号处理程序&#34;(SIGINT,intproc)&#34;在intproc()函数中?

我尝试在该函数中没有该信号处理程序的情况下运行此代码,并且它也正常工作。

2 个答案:

答案 0 :(得分:3)

这是非常古老的代码。在过去(可能是SunOS3,1990-s),执行时会自动卸载信号处理程序。请参阅signal(2)(SysV和BSD行为之间的差异)并避免使用signal

仔细阅读signal(7),然后使用sigaction(2)。不要使用signal(2)。关心异步信号安全功能(唯一可以从信号处理程序调用的;你不应该在信号处理程序中使用printf!)。考虑在信号处理程序中设置一些volatile sig_atomic_t全局(或static)变量(并在外部测试)。

阅读Advanced Linux Programming,详细解释了这些内容。

答案 1 :(得分:1)

函数intproc完成后,程序继续执行,但信号操作恢复为默认值。当它收到第二个SIGINT信号时,程序采取默认操作,即终止程序。

如果您想保留信号处理程序,则需要再次调用signal重新建立它。

这就是为什么你应该总是比sigaction函数更强大signal