如何使用alarm()或sleep每1000毫秒执行一次函数?如果函数在1000毫秒内没有执行或完成,我希望程序执行其他操作。
编辑:添加了伪代码
while(true) {
alarm(1000);
execute function;
sleep(1000);
alarm(0);
}
现在,如果警报(1000)信号SIGALRM是我可以调用其他功能的地方吗? 我对这类东西不熟悉,所以甚至不确定我是否正确使用它。
答案 0 :(得分:7)
要求有多清晰,即你能承受多少抖动?
什么版本的UNIX?
基本上,如果这是一个艰难的截止日期 - 听起来像是一个 - 你需要做一些特殊的事情,因为基本的UNIX并不是一个真正的硬实时系统。
让我们假设您的意思是Linux。你想要
那可能做。如果你需要更细粒度或更可预测的时序,那么你可能需要编写一个内核扩展,它可以用内核定时器驱动。 (Solaris对硬实时有一些改进的支持,但它仍然不是一个真正的硬实时系统。)
如果您可以使用实时Linux或UNIX,生活将变得相当容易。这是一个list of some options。这是一个article you might find usefui.
<强>更新强>
您还应该查看 nanosleep(2)或 setitimer(2)。请注意,所有这些都表示区间至少参数中的区间。如果你有一个艰难的截止日期,你需要等待一些小于实际的间隔,然后找出如何处理你的千毫秒的任何变化。
答案 1 :(得分:2)
我在Linux上使用此功能在几毫秒内“休眠”:
void Sleep(unsigned int milliSeconds)
{
struct timespec req = {0};
time_t seconds = (int) (milliSeconds / 1000);
milliSeconds = milliSeconds - (seconds * 1000);
req.tv_sec = seconds;
req.tv_nsec = milliSeconds * 1000000L;
while (nanosleep(&req, &req) == -1)
continue;
}
答案 2 :(得分:1)
while (1) {
sleep(1);
/* Act */
}
如果您需要更严格的延迟,通常的方法是调用没有fds和低超时的select()。