C SIGINT的信号处理程序

C SIGINT的信号处理程序,c,linux,signals,handler,sigint,C,Linux,Signals,Handler,Sigint,我正在编写以下代码。程序应该能够通过sigaction处理SIGINT。到目前为止,几乎完成了,但我遇到了两个问题。第一个问题是,如果程序在3秒内收到3个信号,程序应打印关机并以状态1退出。 第二个问题是,我使用gettimeofday和struct timeval获取信号到达时间的秒数,但我在这里也失败了。当我尝试时,我陷入了一个无限循环,甚至认为我在3秒内按了3次ctrl+C。而且,产生的秒数是相当大的数字。 我希望有人能帮我解决这两个问题。这是密码 int timeBegin = 0;

我正在编写以下代码。程序应该能够通过sigaction处理SIGINT。到目前为止,几乎完成了,但我遇到了两个问题。第一个问题是,如果程序在3秒内收到3个信号,程序应打印关机并以状态1退出。 第二个问题是,我使用gettimeofday和struct timeval获取信号到达时间的秒数,但我在这里也失败了。当我尝试时,我陷入了一个无限循环,甚至认为我在3秒内按了3次ctrl+C。而且,产生的秒数是相当大的数字。 我希望有人能帮我解决这两个问题。这是密码

int timeBegin = 0;

void sig_handler(int signo) {
   (void) signo;
   struct timeval t;
   gettimeofday(&t, NULL);
   int timeEnd = t.tv_sec + t.tv_usec;

   printf("Received Signal\n");

   int result = timeEnd - timeBegin;

   if(check if under 3 seconds) {  // How to deal with these two problems?
       printf("Shutting down\n");
       exit(1);
   }
   timeBegin = timeEnd   // EDIT: setting the time new, each time when a signal arrives. Is that somehow helpful?
}

int main() {
    struct sigaction act;
    act.sa_handler = &sig_handler;
    sigaction(SIGINT, &act, NULL);

    for( ;; ) {
        sleep(1);
    }
    return 0;
}
这是行不通的,因为tv_sec和tv_usec是不同数量级的。如果需要微秒精度,则必须将值存储在较大的类型中,例如int64_t,并将秒数转换为微秒

   if(check if under 3 seconds) {  // How to deal with these two problems?

你试过什么了?您有几个信号在不同的时间到达,您需要保持它们的一些状态,以了解它们是否都在彼此的3秒内到达。

您的意思是像uint64\u t timeEnd=t.tv\u sec+t.tv\u usec和uint64\u t timeBegin=0?如何将其转换为微秒?为什么?对于第二个问题,我尝试了以下方法:ifresult<3,我有一个计数器,但正如我上面所说的,它不起作用。你必须转换,因为秒和微秒是不同的单位。。。你知道micro是什么意思,对吧?好的,我必须使用因子1000000。但是,我如何解决另一个问题,即几个信号的到达?你能至少给我一些提示吗?试着在信号处理程序之外的变量中保留关于何时以及有多少信号到达的信息。
   if(check if under 3 seconds) {  // How to deal with these two problems?