1

我正在处理以下代码。该程序应该能够使用 sigaction 处理 SIGINT。到目前为止,它几乎完成了,但我遇到了两个问题。
第一个问题是如果在 3 秒内收到 3 个信号,程序应该打印“正在关闭”并以状态 1 退出。
第二个问题是我使用gettimeofdaystruct timeval来获取有关信号到达时间的时间(以秒为单位),但我在这里也失败了。当我尝试它时,我陷入了无限循环,甚至以为我在 3 秒内按了ctrl+ C 3 次。此外,由此产生的秒数是相当大的数字。
我希望有人可以帮助我解决这两个问题。这是代码

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;
}
4

1 回答 1

0
int timeEnd = t.tv_sec + t.tv_usec;

那是行不通的,因为它们tv_sectv_usec数量级不同。如果您想要微秒精度,则必须将值存储为更大的类型(例如int64_t)并将秒转换为微秒。

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

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

于 2013-12-04T21:03:38.803 回答