其他分享
首页 > 其他分享> > 为什么我们两次调用Signal Handler?

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

作者:互联网

我是一个使用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);
    }

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

我试图在该函数中没有该信号处理程序的情况下运行此代码,并且该代码也起作用.

解决方法:

这是很旧的代码.在过去(也许是SunOS3,1990-s),执行时会自动卸载信号处理程序.请参阅signal(2)(SysV和BSD行为之间的差异),并避免使用信号.

仔细阅读signal(7),然后使用sigaction(2).请勿使用signal(2).注意异步信号安全功能(您可以从信号处理程序中调用的唯一函数;您不应在信号处理程序内使用printf!).考虑简单地在信号处理程序中设置一些易失性sig_atomic_t全局(或静态)变量(并在外部进行测试).

阅读Advanced Linux Programming,其中详细说明了这些内容.

标签:c-3,linux,signals,signal-processing
来源: https://codeday.me/bug/20191030/1964807.html