程序应该每隔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秒无限打印一次。如何使其工作?
答案 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
,然后再检查是否为真。