跳轉到內容

C 程式設計/POSIX 參考/unistd.h/sleep

來自華夏公益教科書,自由的教科書

一個 計算機程式 (程序任務,或 執行緒) 可以睡眠,這會將它置於一個 非活動狀態 一段時間。最終,一個間隔 計時器 到期,或者接收到一個 訊號中斷 會導致程式恢復執行。

一個典型的 sleep 系統呼叫 將時間值作為引數,指定程序在恢復執行之前必須睡眠的最短時間。引數通常指定秒,儘管一些作業系統提供更精細的精度,例如毫秒或微秒。

在 Windows 2000 和更新版本中,Sleep() 函式 接受一個引數,表示睡眠的毫秒數。 [1] sleep() 函式包含在 kernel32.dll 中,但沒有 sleep 命令 (可執行檔案) 本地可用於指令碼 (批處理檔案)。它可以在 Windows 實用程式集合中找到,例如 Windows 2003 資源工具包。 [2]

類 Unix 作業系統上,呼叫 sleep() 函式,提供一個無符號整型引數,表示睡眠的秒數。 [3] (為了更精確的睡眠時間,可以使用 usleep() 函式。) [4]

C 語言示例

[編輯 | 編輯原始碼]

在 Windows OS 中

while (myInt <= 100)
{
    Sleep(2*1000);  // Sleep for 2 seconds
}

在 Unix 中

while (myInt <= 100)
{
    sleep(2);       // Sleep for 2 seconds
}

C++ 示例

[編輯 | 編輯原始碼]
#include <windows.h> // Windows.h is necessary for Sleep function
sleep(3000) // In milliseconds

底層功能

[編輯 | 編輯原始碼]

睡眠會導致執行緒或程序進入不可執行狀態。這允許 CPU 掛起執行緒或程序並繼續執行其他執行緒或程序,直到睡眠結束,執行緒或程序被允許繼續執行。在 Windows 系統上,睡眠系統呼叫是不可中斷的,這與 WaitSleepEx 系統呼叫不同,它們可以被中斷。 [5] [6] 然而,一些標為 sleep() 的函式是可變的。 [7] 在 Unix 系統上,訊號會中斷系統呼叫,包括 sleep()。 [8] 睡眠通常會導致糟糕的程式碼設計,wait 或 nanosleep 函式更可取。

一些永遠不會終止的 系統程式 會執行一個 事件迴圈,在每個迴圈的開始進入睡眠狀態,等待某個事件喚醒它們。一旦收到事件,程式就會處理該事件,然後返回到下一個等待迴圈的開始。

其他程式會定期 輪詢 事件,透過進入睡眠狀態,並在特定時間間隔後恢復執行。一旦恢復執行,程式就會輪詢事件或狀態更改,然後處理在睡眠期間發生的任何事件。處理完事件後,程式會再次進入睡眠狀態,等待下一個時間間隔。某些型別的 看門狗 事件或 保持活動 訊號可以由這些型別的程式生成。

不可中斷睡眠

[編輯 | 編輯原始碼]

不可中斷睡眠狀態是一種睡眠狀態,不會立即處理訊號。它只會因為等待的資源變得可用或在等待過程中超時(如果在進入睡眠狀態時指定)而喚醒。它主要用於等待磁碟或網路 I/O(輸入/輸出)的裝置驅動程式。當程序處於不可中斷睡眠狀態時,在睡眠期間累積的訊號將在程序從系統呼叫或陷阱返回時被注意到。

在類 Unix 系統中,命令 'ps -l' 使用程式碼 "D" 表示程序的不可中斷睡眠狀態。


參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書