如何在前50秒内忽略信号?

时间:2017-10-12 01:50:04

标签: c++ signals

void signal_handler(int signo)
{
    struct sigaction act;

    if ((sigaction(signo, NULL, &act) == -1) || (act.sa_handler != SIG_IGN))
    {
        alarm(50);
    }

}

int main()
{
    sigaction(SIGINT,signal_handler);
    sigaction(SIGALAM,signal_handler);
    alarm(50);

    while (1)
    {
    }
     return 0;
}

我想在最初的50秒内忽略Ctrl + C信号。我试着报了警,但它没有忽略信号。

1 个答案:

答案 0 :(得分:1)

这些是您实现目标所需遵循的步骤:

  • SIGINT启动时将SIG_IGN设置为main
  • 然后设置SIGALARM以调用不同的处理程序(50秒后)。
  • 在该处理程序中,更改SIGINT,使其现在指向实际的处理程序。

这应该在前五十秒左右忽略SIGINT个中断,然后再对它们进行操作。

这是一个完整的程序,显示了这一点。它基本上执行上面详述的步骤,但对测试程序稍作修改:

  • 开始忽略INT
  • 设置ALRM以在十秒后激活。
  • 每秒开始生成INT个信号,持续20秒。
  • 当闹钟激活时,请停止忽略INT

该计划是:

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

static time_t base, now; // Used for tracking time.

// Signal handlers.

void int_handler(int unused) {
    // Just log the event.

    printf("  - Handling INT at t=%ld\n", now - base);
}

void alarm_handler(int unused) {
    // Change SIGINT handler from ignore to actual.

    struct sigaction actn;
    actn.sa_flags = 0;
    actn.sa_handler = int_handler;
    sigaction(SIGINT, &actn, NULL);
}

int main(void)
{
    base = time(0);

    struct sigaction actn;

    // Initially ignore INT.

    actn.sa_flags = 0;
    actn.sa_handler = SIG_IGN;
    sigaction(SIGINT, &actn, NULL);

    // Set ALRM so that it enables INT handling, then start timer.

    actn.sa_flags = 0;
    actn.sa_handler = alarm_handler;
    sigaction(SIGALRM, &actn, NULL);
    alarm(10);

    // Just loop, generating one INT per second.

    for (int i = 0; i < 20; ++i)
    {
        now = time(0);
        printf("Generating INT at t=%ld\n", now - base);
        raise(SIGINT);
        sleep(1);
    }

    return 0;
}

这是我的盒子上的输出,所以你可以看到它在行动,忽略前十秒的INT信号,然后对它们采取行动:

Generating INT at t=0
Generating INT at t=1
Generating INT at t=2
Generating INT at t=3
Generating INT at t=4
Generating INT at t=5
Generating INT at t=6
Generating INT at t=7
Generating INT at t=8
Generating INT at t=9
Generating INT at t=10
  - Handling INT at t=10
Generating INT at t=11
  - Handling INT at t=11
Generating INT at t=12
  - Handling INT at t=12
Generating INT at t=13
  - Handling INT at t=13
Generating INT at t=14
  - Handling INT at t=14
Generating INT at t=15
  - Handling INT at t=15
Generating INT at t=16
  - Handling INT at t=16
Generating INT at t=17
  - Handling INT at t=17
Generating INT at t=18
  - Handling INT at t=18
Generating INT at t=19
  - Handling INT at t=19