分类:
2008-12-08 23:44:25
在所有Unix中都有的‘sleep()’函数只允许以秒计算的时间间隔。如果你想要更细化,那么你需要寻找替换方法:
许多系统有一个‘usleep()’函数
你可以使用‘select()’或‘poll()’, 并设置成无文件描述符并试验; 一个普遍技巧是基于其中一个函数写一个‘usleep()’函数。 (参见comp.unix.questions FAQ 的一些例子)
如果你的系统有itimers(很多是有的)(译者注: setitimer和getitimer是两个操作itimers的函数, 使用“man setitimer”确认你的系统支持), 你可以用它们自己撺一个‘usleep()’。 (参见BSD源程序的‘usleep()’以便知道怎样做)
如果你有POSIX实时(realtime)支持, 那会有一个‘nanosleep()’函数。
众观以上方法,‘select()’可能是移植性最好的(直截了当说,它经常比 ‘usleep()’或基于itimer的方法更有效)。但是,在睡眠中捕获信号的做法会有所不同;基于不同应用,这可以成为或不成为一个问题。
无论你选择哪条路,意识到你将受到系统计时器分辨率的限制是很重要的(一些系统允许设置非常短的时间间隔,而其他的系统有一个分辨率,比如说10毫 秒,而且总是将所有设置时间取整到那个值)。而且,关于‘sleep()’,你设置的延迟只是最小值(译者注:实际延迟的最小值);经过这段时间的延迟, 会有一个中间时间间隔直到你的进程重新被调度到。