用于相同信号的多个信号处理器,例如SIGALRM

时间:2017-03-14 19:53:18

标签: c signals

我有一个示例程序,每秒触发一次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()的参数,是否可以为同一信号设置多个信号处理程序;方法。例如。如果我呼叫报警(1)和报警(2),则必须调用两种不同的方法 好吧,我在这里使用闹钟的想法是,我想在3个不同的时间间隔中调用三种不同的方法。例如调用func1();每隔X秒后,在每Y秒后调用func2()并在每Z秒后调用func3(),这将在无限循环中运行。如果警报的想法不适合这里,那么任何其他提示/帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

  

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

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

  

如果我呼叫报警(1)和报警(2),则必须调用两种不同的方法。

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

答案 1 :(得分:0)

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

signal(SIGALRM, signal_handler_1);

/* do some l33t stuff */

signal(SIGALRM, signal_handler_2);

SIGALRM将由signal_handler_2处理。