Linux作業系統 sleep(0)、sleep(1)和sleep(-1)的區別,他們各有什麼作用

boshuzhang發表於2016-03-26

sleep(0)、sleep(1)和sleep(-1)的區別,他們各有什麼作用?

sleep(0)、sleep(1)、sleep(-1)的區別,他們各有什麼作用?對於Sleep(1)所產生的效果,在不同的系統上會/有不同的表現嗎?sleep(-1)的作用是什麼?

評論 (4) •  • 連結 • 2012-12-13 
  • 0
    什麼地方用的sleep()? – runer 2012-12-13
  • 0
    man sleep – 斑駁-neo 2012-12-13
  • 0
    @runer linux,多執行緒 – freeboy1015 2012-12-14
  • 0
    還沒用過sleep(-1) – 274131487 2012-12-18
3個答案

linux中sleep的函式引數是unsigned int,如下:

  1. #include <unistd.h>
  2. unsigned int sleep(unsigned int seconds);

參考連結:sleep(3) - Linux man page

sleep(-1)呼叫導致隱形的型別轉換,-1就轉化成0xffffffff,也就是32位無符號整形的最大值

sleep(0)的結果與系統實現有關, glibc針對Linux的實現, sleep(0)不會做任何系統呼叫而直接返回。(glibc2.9中sleep原始碼)

  1. /* We are going to use the `nanosleep' syscall of the kernel.  
  2.    But the kernel does not implement the stupid SysV SIGCHLD
  3.    vs. SIG_IGN behaviour for this syscall.  Therefore we have
  4.    to emulate it here.  */
  5. unsigned int
  6. __sleep (unsigned int seconds)
  7. {
  8.   const unsigned int max
  9.     = (unsigned int) (((unsigned long int) (~((time_t) 0))) >> 1);
  10.   struct timespec ts;
  11.   sigset_t set, oset;
  12.   /* This is not necessary but some buggy programs depend on this.  */
  13.   if (__builtin_expect (seconds == 0, 0))
  14.     {
  15. #ifdef CANCELLATION_P
  16.       CANCELLATION_P (THREAD_SELF);  //相當於 pthread_testcancel();0
  17. #endif
  18.       return 0;
  19.     }
  20. ... ...
  21. }

只有sleep(1)時, 才會呼叫到nanosleep

參考連結:
關於sleep(0)
sched_yield vs. sleep(0)

freeboy1015
freeboy1015
2598
編輯於 2012-12-17
評論 (1) • 連結 • 2012-12-17
  • 0
    我看的一段程式碼中sleep(-1)的功能好像是“阻止程式退出”。 – freeboy1015 2012-12-17

sleep(-1)就是sleep(UINT_MAX)

評論 (0) • 連結 • 2012-12-13

sleep(0)是讓出CPU
linux下是usleep吧

評論 (0) • 連結 • 2012-12-17

相關文章