所以我正在做一个项目,我需要让我的 main 在收到 a 时执行不同的任务,比如说,SIGINT
当它收到一个SIGTSTP
. 其余时间, main 不需要做任何事情。到目前为止,我提出的代码对所有信号都有一个信号处理函数,并且基于signo
,它为该信号设置了适当的标志。Main 在一个while(1)
循环中运行(通过一些 sleep 调用来避免忙于等待)并检查这些标志。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
// Using exponential backoff for sleep time
#define MAX_BACKOFF 3600 // 1 hour
#define INITIAL_BACKOFF 1 // 1 sec
static int backoff = INITIAL_BACKOFF;
static int flgsigint = 0;
static int flgsigtstp = 0;
void sighandler(int signo)
{
if (signo == SIGINT)
flgsigint = 1;
else if (signo == SIGTSTP)
flgsigtstp = 1;
backoff = INITIAL_BACKOFF;
}
int main()
{
// Handler for SIGINT, SIGTSTP
static struct sigaction act1;
act1.sa_handler = sighandler;
sigemptyset(&(act1.sa_mask));
sigaddset(&(act1.sa_mask), SIGINT);
sigaddset(&(act1.sa_mask), SIGTSTP);
sigaction(SIGINT, &act1, NULL);
sigaction(SIGTSTP, &act1, NULL);
while (1)
{
// Using exponential backoff for sleep time
sleep(backoff);
backoff = backoff << 2;
if (backoff > MAX_BACKOFF)
backoff = MAX_BACKOFF;
// Check for signal flags
if (flgsigint)
{
printf("main: gonna do some SIGINT stuff\n");
// stuff
flgsigint = 0;
}
if (flgsigtstp)
{
printf("main: gonna do some SIGTSTP stuff\n");
// stuff
flgsigtstp = 0;
}
}
exit(0);
}
现在据我测试,它似乎工作正常。我主要感兴趣的是捕捉最新的,比如说,SIGINT
在特定时间发生的突发事件,所以如果丢失一些也没关系。
我的方法看起来不错,或者当我继续我的项目时,我会对奇怪的行为感到惊讶吗?
另外,对于 main 需要做的等待,还有什么更好的办法吗?
任何帮助,将不胜感激!