C程序每隔5秒打印一次并显示退出时的总时间

时间:2017-10-04 05:33:55

标签: c

程序应该每隔5秒打印到屏幕并显示“%d毫秒时生存\ n”。当用户键入轮询程序<Control><A>或中断版本<Control><C>时,程序应该停止并输出:

program terminated by user. Total time is %d milliseconds %d seconds\n

我的计划:

#include <signal.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>

volatile sig_atomic_t print_flag = false;

void handle_alarm( int sig ) {
  print_flag = true;
}


int main() {
    struct timeval start, stop;
    double secs = 0;
    char key_press;
    char input_key;
    int ascii_value;
    float time_taken;
    clock_t t;
    t = clock();

    gettimeofday(&start, NULL);

    signal( SIGALRM, handle_alarm );
    alarm( 5 ); 

    for (;;) {


      if ( print_flag ) {
        print_flag = false;
        alarm( 5 );
        gettimeofday(&stop, NULL);
        secs = (double)(stop.tv_usec - start.tv_usec) / 1000000 + (double)(stop.tv_sec - start.tv_sec) * 1000;
        printf("Alive at %f ms \n",secs);
        input_key=getchar();
        ascii_value=input_key;
        if(ascii_value==1) {
          t = clock() - t;
          time_taken = ((float)t)/CLOCKS_PER_SEC; // in seconds
          printf("total time taken= %f sec", time_taken);
          break;
        }
      }
    }
}

我希望程序能够连续运行但是当我按下ctrl a它应该终止。该程序打印“活动5000.000毫秒并停止打印。如果我没有添加使用ctrl A终止的代码,程序每5秒无限打印一次。如何使其工作?

2 个答案:

答案 0 :(得分:1)

当您以这种方式请求输入时,您正在使用同步阻塞I / O.该过程会一直持续到输入为止。如果您希望程序在等待输入时继续运行,则需要深入研究异步非阻塞I / O.查找select()函数

https://en.wikipedia.org/wiki/Asynchronous_I/O

https://www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html

答案 1 :(得分:0)

print_flag = false;循环中执行for后,您再也没有将print_flag重新设置回true。因此,if ( print_flag )块中的代码只执行一次。

  

如何让它发挥作用?

要使其正常运作,您需要先将print_flag设置为true,然后再检查是否为真。