扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
接下来的这段程式码是 Doug Gwyn 在 System V 中模拟 4BSD 并利用 4BSD中的 select() 系统呼叫。Doung 自己都叫它为''nap()'' ;你也可以把它叫做"usleep()";
/*
usleep -- support routine for 4.2BSD system call emulations
last edit: 29-Oct-1984 D A Gwyn
*/
extern int select();
int
usleep( usec ) /* returns 0 if ok, else -1 */
long usec; /* delay in microseconds */
{
static struct /* `timeval'' */
{
long tv_sec; /* seconds */
long tv_usec; /* microsecs */
} delay; /* _select() timeout */
delay.tv_sec = usec / 1000000L;
delay.tv_usec = usec % 1000000L;
return select( 0, (long *)0, (long *)0, (long *)0, &delay );
}
On System V you might do it this way:
/*
subseconds sleeps for System V - or anything that has poll()
Don Libes, 4/1/1991
The BSD analog to this function is defined in terms of
microseconds while poll() is defined in terms of milliseconds.
For compatibility, this function provides accuracy "over the long
run" by truncating actual requests to milliseconds and
accumulating microseconds across calls with the idea that you are
probably calling it in a tight loop, and that over the long run,
the error will even out.
If you aren''t calling it in a tight loop, then you almost
certainly aren''t making microsecond-resolution requests anyway,
in which case you don''t care about microseconds. And if you did,
you wouldn''t be using UNIX anyway because random system
indigestion (i.e., scheduling) can make mincemeat out of any
timing code.
Returns 0 if successful timeout, -1 if unsuccessful.
*/
#include <poll.h>
int
usleep(usec)
unsigned int usec; /* microseconds */
{
static subtotal = 0; /* microseconds */
int msec; /* milliseconds */
/* ''foo'' is only here because some versions of 5.3 have
* a bug where the first argument to poll() is checked
* for a valid memory address even if the second argument is 0.
*/
struct pollfd foo;
subtotal += usec;
/* if less then 1 msec request, do nothing but remember it */
if (subtotal < 1000) return(0);
msec = subtotal/1000;
subtotal = subtotal%1000;
return poll(&foo,(unsigned long)0,msec);
}
在 System V 或其他 非-BSD 的 Unix 中要使用这类的「小睡」程式,可以用Jon Zeeff 的 s5nap,它曾被发表在comp.sources.misc, volume 4 中。它需要安装一个驱动程式,但是装好后就可以跑得很好。(它的精确度会受到kernel 中 HZ 这个变数的影响,因为它是用到了 kernel 中的 delay() 函式。)
现在很多较新版本的 Unix 都有提供这类的「小睡」功能了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者