让我说我的程序中有一些函数func(),我需要在一些特定的延迟后调用它。到目前为止,我用谷歌搜索了它,最后得到了以下代码:
#include <stdio.h>
#include <sys/time.h> /* for setitimer */
#include <unistd.h> /* for pause */
#include <signal.h> /* for signal */
void func()
{
printf("func() called\n");
}
bool startTimer(double seconds)
{
itimerval it_val;
double integer, fractional;
integer = (int)seconds;
fractional = seconds - integer;
it_val.it_value.tv_sec = integer;
it_val.it_value.tv_usec = fractional * 1000000;
it_val.it_interval = it_val.it_value;
if (setitimer(ITIMER_REAL, &it_val, NULL) == -1)
return false;
return true;
}
int main()
{
if (signal(SIGALRM, (void(*)(int))func) == SIG_ERR)
{
perror("Unable to catch SIGALRM");
exit(1);
}
startTimer(1.5);
while(1)
pause();
return 0;
}
它有效,但问题是settimer()导致func()被重复调用,间隔为1.5秒。而我需要的是调用func()一次。 谁能告诉我怎么做?也许,我需要一些额外的参数来settimer()?
注意:时间间隔应该精确,因为此程序将在以后播放midi音乐。
答案 0 :(得分:3)
除非你需要程序做其他事情,否则你可以在分配的时间内睡觉。
如果您需要使用闹钟,可以安装一次要处理的闹钟。
从手册页:
struct timeval it_interval
这是连续计时器中断之间的时间段。如果为零,则仅发送一次警报。
而不是你的代码:
it_val.it_interval = it_val.it_value;
我设置:
it_val.it_interval.tv_sec = 0;
it_val.it_interval.tv_usec = 0;
除了你已经设置的it_val.it_value。你所做的就是对两种结构使用相同的值,这就是你看到重复间隔的原因。