C-如何使信号处理程序打印时间经过



我正在编写一个具有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 TIMERn");
        exit(1);
    }
    FILE *fp;
    fp = fopen(argv[1], "rb");
    if (fp == NULL) {
        fprintf(stderr, "Fail to open filen");
        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 timern");
        exit(1);    
    }
    while(1) {
        fseek(fp, (rand() % 100) * sizeof(int), SEEK_SET);
        fread(&i, sizeof(int), 1, fp);
        printf("%dn", i);
        count++;
    }
    fclose(fp);
    return 0;
}

为了打印经过的时间,处理程序必须可以访问计时器。一种简单的方法是,就像计数器一样,将计时器也成为全局变量。对于要打印的额外整数,这是因为信号中断了printf()呼叫中间的循环。循环中的printf()应删除,因为信号处理程序将打印循环迭代的总数。

相关内容

  • 没有找到相关文章