C 编程/POSIX 参考/unistd.h/sleep
一个 计算机程序 (进程,任务,或 线程) 可以睡眠,这会将它置于一个 非活动状态 一段时间。最终,一个间隔 计时器 到期,或者接收到一个 信号 或 中断 会导致程序恢复执行。
一个典型的 sleep 系统调用 将时间值作为参数,指定进程在恢复执行之前必须睡眠的最短时间。参数通常指定秒,尽管一些操作系统提供更精细的精度,例如毫秒或微秒。
在 Windows 2000 和更新版本中,Sleep()
函数 接受一个参数,表示睡眠的毫秒数。 [1] sleep()
函数包含在 kernel32.dll 中,但没有 sleep 命令 (可执行文件) 本地可用于脚本 (批处理文件)。它可以在 Windows 实用程序集合中找到,例如 Windows 2003 资源工具包。 [2]
在 类 Unix 操作系统上,调用 sleep()
函数,提供一个无符号整型参数,表示睡眠的秒数。 [3] (为了更精确的睡眠时间,可以使用 usleep()
函数。) [4]
在 Windows OS 中
while (myInt <= 100)
{
Sleep(2*1000); // Sleep for 2 seconds
}
在 Unix 中
while (myInt <= 100)
{
sleep(2); // Sleep for 2 seconds
}
#include <windows.h> // Windows.h is necessary for Sleep function
sleep(3000) // In milliseconds
睡眠会导致线程或进程进入不可运行状态。这允许 CPU 挂起线程或进程并继续执行其他线程或进程,直到睡眠结束,线程或进程被允许继续执行。在 Windows 系统上,睡眠系统调用是不可中断的,这与 Wait 和 SleepEx
系统调用不同,它们可以被中断。 [5] [6] 然而,一些标为 sleep() 的函数是可变的。 [7] 在 Unix 系统上,信号会中断系统调用,包括 sleep()。 [8] 睡眠通常会导致糟糕的代码设计,wait 或 nanosleep 函数更可取。
一些永远不会终止的 系统程序 会执行一个 事件循环,在每个循环的开始进入睡眠状态,等待某个事件唤醒它们。一旦收到事件,程序就会处理该事件,然后返回到下一个等待循环的开始。
其他程序会定期 轮询 事件,通过进入睡眠状态,并在特定时间间隔后恢复执行。一旦恢复执行,程序就会轮询事件或状态更改,然后处理在睡眠期间发生的任何事件。处理完事件后,程序会再次进入睡眠状态,等待下一个时间间隔。某些类型的 看门狗 事件或 保持活动 信号可以由这些类型的程序生成。
不可中断睡眠状态是一种睡眠状态,不会立即处理信号。它只会因为等待的资源变得可用或在等待过程中超时(如果在进入睡眠状态时指定)而唤醒。它主要用于等待磁盘或网络 I/O(输入/输出)的设备驱动程序。当进程处于不可中断睡眠状态时,在睡眠期间累积的信号将在进程从系统调用或陷阱返回时被注意到。
在类 Unix 系统中,命令 'ps -l' 使用代码 "D" 表示进程的不可中断睡眠状态。