0

所以我正在做一个项目,我需要让我的 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 需要做的等待,还有什么更好的办法吗?

任何帮助,将不胜感激!

4

0 回答 0