如何让信号处理程序打印时间过去?

时间:2017-03-08 19:34:12

标签: c signals sigaction setitimer

我正在编写一个具有sigaction处理程序的C程序。它还有一个itimerval,以防SIGALRM暂时不会出现。

处理程序应

  1. 打印无限循环完成的总数
  2. 打印已过去的时间
  3. 出口(1);
  4. 我注意到信号处理程序没有采用自定义参数,所以我有一个全局循环计数器 我的问题是:我如何获得时间?我是否从计时器中获取了这些信息?我不完全理解计时器的用法 此外,代码在终止之前的fprintf调用之后打印1个额外的整数(来自循环)。如何解决?

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/time.h>
    
    int count = 0;
    
    void handler (int code) {
        fprintf(stderr, "Reads completed: %d \n", count);
        exit(1);
    }
    
    int main(int argc, char const *argv[])
    {
        if (argc != 3) {
            fprintf(stderr, "Usage: time_reads FILENAME TIMER\n");
            exit(1);
        }
    
        FILE *fp;
        fp = fopen(argv[1], "rb");
        if (fp == NULL) {
            fprintf(stderr, "Fail to open file\n");
            exit(1);
        }
    
        int i;
        srand(time(NULL));
    
        struct sigaction sa;
        sa.sa_handler = handler;
        sa.sa_flags = 0;
        sigemptyset(&sa.sa_mask);
        sigaction(SIGALRM, &sa, NULL);
    
        struct itimerval timer;
        timer.it_value.tv_sec = strtol(argv[2], NULL, 10    );
        timer.it_value.tv_usec = 0;
        timer.it_interval.tv_sec = 0;
        timer.it_interval.tv_usec = 0;
    
        if (setitimer(0, &timer, NULL) < 0) {
            fprintf(stderr, "Fail to set timer\n");
            exit(1);    
        }
    
        while(1) {
            fseek(fp, (rand() % 100) * sizeof(int), SEEK_SET);
            fread(&i, sizeof(int), 1, fp);
            printf("%d\n", i);
            count++;
        }
    
        fclose(fp);
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

为了打印已用时间,处理程序必须能够访问计时器。一个简单的方法就是让计时器成为一个全局变量,就像计数器一样。对于要打印的额外整数,这是因为信号在调用printf()的过程中中断了循环。应该删除循环中的printf(),因为循环迭代的总数将由信号处理程序打印。