我想在特定时间内运行C程序。在这段时间之后,该程序应终止。我搜索了一些有关此文档的文档,但其中许多文档都使用sleep
函数。我不想使用它。我想在无限循环中检查当前时间是否大于目标时间。
例如下面的代码,我的目标时间是5,并且当运行时间大于5时,程序应该终止。
但是代码导致无限循环。我该如何解决这个问题?
void thread_handler(union sigval sv) {
char *s = sv.sival_ptr;
/* Will print "5 seconds elapsed." */
puts(s);
}
int main(void) {
char info[] = "5 seconds elapsed.";
timer_t timerid;
struct sigevent sev;
struct itimerspec trigger;
struct itimerspec triggerAfter;
memset(&sev, 0, sizeof(struct sigevent));
memset(&trigger, 0, sizeof(struct itimerspec));
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = &thread_handler;
sev.sigev_value.sival_ptr = &info;
timer_create(CLOCK_REALTIME, &sev, &timerid);
trigger.it_value.tv_sec = 5;
timer_settime(timerid, 0, &trigger, NULL);
timer_gettime(timerid,&trigger);
while (1) {
if ((int)trigger.it_value.tv_sec > 5) { //checking the current time is bigger than the target time, it it is then exit from the program
timer_delete(timerid);
exit(0);
}
}
}
答案 0 :(得分:2)
如果要在繁忙的循环中进行检查和比较,则只需调用:=
即可,完全避免使用计时器。
计时器的全部目的是避免此类繁忙的循环。
在您的情况下,您的主线程可以简单地暂停,并且您可以退出运行的thread_handler函数 在计时器处理程序的专用线程上。
clock_gettime
如果您仍然想忙于检查,则需要在等待循环中使用#include <time.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void thread_handler(union sigval sv) {
char *s = sv.sival_ptr;
/* Will print "5 seconds elapsed." */
puts(s);
exit(0);
}
int main(void) {
char info[] = "5 seconds elapsed.";
timer_t timerid;
struct sigevent sev;
struct itimerspec trigger;
struct itimerspec triggerAfter;
memset(&sev, 0, sizeof(struct sigevent));
memset(&trigger, 0, sizeof(struct itimerspec));
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = &thread_handler;
sev.sigev_value.sival_ptr = &info;
if(0>timer_create(CLOCK_REALTIME, &sev, &timerid)) return perror("timer_create"),1;
trigger.it_value.tv_sec = 5;
if(0>timer_settime(timerid, 0, &trigger, NULL)) return perror("timer_settime"),1;
pause();
}
。仅调用一次将不会自动timer_gettime
对象自动更新。