0

我正在编写一个具有 sigaction 处理程序的 C 程序。如果 SIGALRM 在一段时间内没有出现,它也有一个 itimerval。

处理程序应

  1. 打印完成的无限循环总数
  2. 打印经过的时间
  3. 退出(1);

我注意到信号处理程序不采用自定义参数,所以我有一个全局循环计数器。
我的问题是:我如何获得经过的时间?我可以从计时器中获得这些信息吗?我不完全了解计时器的用法。
此外,代码在终止之前的 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;
}
4

1 回答 1

0

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

于 2017-03-08T23:56:57.653 回答