gpt4 book ai didi

c++ - 如何忽略前 50 秒的信号?

转载 作者:行者123 更新时间:2023-11-30 05:08:41 25 4
gpt4 key购买 nike

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 信号。我用警报试了一下,但它并没有忽略信号。

最佳答案

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

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

这应该在前五十秒左右忽略 SIGINT 中断,然后再对它们采取行动。


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

  • 开始忽略 INT
  • ALRM 设置为在十秒后激活。
  • 开始每秒生成 INT 信号,持续二十秒。
  • 当警报激活时,停止忽略 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

关于c++ - 如何忽略前 50 秒的信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46700153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com