跳转到内容

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" 表示进程的不可中断睡眠状态。


参考文献

[编辑 | 编辑源代码]
华夏公益教科书