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信号。我试着报了警,但它没有忽略信号。
答案 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