首页 > 编程开发 > C/C++ > 正文  
在C程式中要怎么用 sleep() 才能够sleep小于一秒?
出自:Steve Hayman 2002年01月07日 14:01
  首先要注意的是,你只能指定 delay 的「最短」时间;实际上会 delay 多久和 
  系统的 scheduling 方式有关,例如系统当时有负载。如果你倒楣的话,它还可 
  能会 delay 蛮长的时间。 

  并没有一个标准函式能够在「小睡」(很短的 sleep)期间提供你计数的功能。 
  某些系统有提供 usleep(n) 的函式,它能够暂停执行 n 微秒(microsecond) 
  的时间。如果你所使用的系统没有提供 usleep() 函式,那么以下有可在 BSD, 
  System V 使用中的作法。 

  接下来的这段程式码是 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 都有提供这类的「小睡」功能了。 
】【http://www.trainlinux.com】【Close
『相关资料』
小工具 search (2002-01-06 14:00)
用gcc 编译,为何有不同的结果 (关于socket函数)? (2002-01-06 14:00)
linux内核模块和驱动程序的编写 (2002-01-06 14:00)
什么是module 以及如何写一个module (2002-01-06 13:59)
Home 

诚恩Linux培训工作室