【问题标题】:Multiple signal handlers for the same signal e.g. SIGALRM [duplicate]同一信号的多个信号处理程序,例如SIGALRM [重复]
【发布时间】:2017-08-05 08:10:21
【问题描述】:

我有一个每秒触发 SIGALRM 的示例程序。以下是我的代码。

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

volatile sig_atomic_t _flag = false;

void _sigHandler( int signal )
{
    _flag = true;
}

int main()
{
    signal( SIGALRM, _sigHandler );
    alarm( 1 );

    while (true)
    {
        if ( _flag)
        {
            printf( "SIGALRM received\n" );
            _flag = false;
            alarm( 1 );
        }
    }
}

我的问题是,是否可以根据传递给 alarm() 的参数为同一信号设置多个信号处理程序;方法。例如。如果我调用 alarm(1) 和 alarm(2),则必须调用两种不同的方法。
好吧,我在这里使用警报的想法是,我想在 3 个不同的时间间隔内调用三种不同的方法。例如调用 func1();每 X 秒后,每 Y 秒后调用 func2(),每 Z 秒后调用 func3(),这将在无限循环中运行。如果警报的想法不适合这里,那么任何其他提示/帮助将不胜感激。

【问题讨论】:

  • 没有。每个信号(类型)都只有一种处理方式。您可以注册同一个函数来处理一种以上的信号,但您不能注册多个函数来处理同一种信号。
  • 如果funcX 应该每X 秒运行一次,而funcY 应该每Y 秒运行一次,如果自上次以来一直是X 秒,请调用funcX调用它的时间,如果自上次调用以来已经过 Y 秒,则调用 funcY
  • 关于多路复用超时信号,我写了一个例子here

标签: c signals


【解决方案1】:

是否可以根据传递给 alarm() 的参数为同一信号设置多个信号处理程序。

没有。一个信号在任何时候都只能有一个信号处理程序。如果安装很多,最后一个是唯一有效的。

如果我调用 alarm(1) 和 alarm(2),则必须调用两个不同的方法。

alarm() 在指定间隔后引发 SIGALRM。它甚至不知道/关心是否有 SIGALRM 的信号处理程序,更不用说“多个”信号处理程序了。简而言之,这是不可能的。

【讨论】:

    【解决方案2】:

    每个信号只能使用一个信号处理程序。代码中的最后一个信号处理程序是使用的,这意味着如果您编写:

    signal(SIGALRM, signal_handler_1);
    
    /* do some l33t stuff */
    
    signal(SIGALRM, signal_handler_2);
    

    SIGALRM 将由signal_handler_2 处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2013-06-19
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多