SIGINT的信号处理程序

时间:2013-12-04 20:58:20

标签: c linux signals handler sigint

我正在处理以下代码。该程序应该能够处理带有sigaction的SIGINT。到目前为止,它已经差不多完成了,但我遇到了两个问题。
第一个问题是程序应该打印“关闭”并在状态1退出,如果它在3秒内收到3个信号。
第二个问题是我使用 gettimeofday struct 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;
}

1 个答案:

答案 0 :(得分:1)

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秒内到达。