Linux上C上最简单,最有效的方法是在一定的延迟之后asynchronous地调用一个函数(比如JavaScript的setTimeout
)或者设置一个重复的定时器周期性地调用它(类似于setInterval
)?
虽然这个问题适用于Linux,但我希望有一个跨平台的方法。
最简单的Linux特定解决方案是使用alarm
功能:
void alarm_handler (int signum) { printf ("Five seconds passed!\n"); } signal (SIGALRM, alarm_handler); alarm (5);
getitimer
和setitimer
函数可用于创建精度更高的定时器。 ( 更多… )。
有两种方法可以解决这个问题:
首先,正如另一个答案中提到的,是使用alarm()
或setitimer()
触发的信号。 这两个函数都可以在任何符合POSIX的操作系统中使用。 还有第三个叫做ualarm()
函数,它在2008年已经过时了。 ualarm()
一面是,在信号处理程序中做任何重要的事情(例如,I / O或其他系统调用)是不安全的,所以你真正想做的设置一个标志,让别的东西捡起来。
其次是使用睡眠一段时间的线程,然后调用你的函数。 POSIX标准化线程作为20世纪90年代初的扩展,以及支持线程支持POSIX线程的大多数现代操作系统。 这里的缺点是你必须理解两个执行上下文共享相同的数据空间,并相应地设计你的程序,或者你将遇到的问题,可能是一个噩梦调试。
请注意,警报和睡眠只承诺至少在指定的时间内完成所做的事情,所以您无法保证在实时操作系统上获得的准确性。