如何在第二天每秒运行一次代码?

时间:2011-01-10 01:12:55

标签: macos unix time

我正在为Mac编写一个命令行实用程序,它应该每秒打印出状态信息。显然,我不想每秒轮询数十亿次。我能想到的另一种方法是获取当前时间并使用select等待差异。还有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

你做的任何等待都保证至少等待那段时间,而不是完全等待。 OSX不是一个实时操作系统 - 我认为没有办法保证这样的东西。

如果你只想估计它,那么就可以了解现在和你想要的时间之间的差异(可能会少一些时间来记录日志)。

答案 1 :(得分:1)

通常使用计时器调度方法可以解决问题。无论如何要记住,使用简单的计时器,精度并不是最好的。

答案 2 :(得分:1)

这就是我所拥有的:

#import <stdlib.h>
#import <stdio.h>
#import <time.h>
#import <sys/time.h>

#define TIME_LENGTH 9

int main ()
{
    struct timeval now;
    struct timespec wait;

    time_t seconds;
    char str[TIME_LENGTH];

    wait.tv_sec = 0;

    for (;;) {
        gettimeofday(&now, NULL);
        wait.tv_nsec = (1000000 - now.tv_usec) * 1000;
        nanosleep(&wait, NULL);

        seconds = now.tv_sec+1;
        strftime(str, TIME_LENGTH, "%T", localtime(&seconds));
        puts(str);
    }
}

它适用于“眼球”精度,这应该足够好。看起来它与内置的菜单栏时钟同步更新。显然,time.hclock_nanosleep中有一个函数可以等到一段时间而不是等待一段时间,但mac不支持这种用法。