C 语言 usleep() 函数

2024年8月28日 | 阅读 4 分钟

在本文中,我们将讨论 usleep() 函数,包括其 语法示例

在 C 编程中,"usleep()" 函数 可以短暂地暂停正在运行的程序。"usleep()" 函数 可以容纳这段短暂的时间。我们使用 "usleep()" 函数 来暂停程序 微秒。程序将在提供的微秒数后恢复执行。当我们需要挂起让程序休眠不足一秒时,我们就会使用此函数。其值以微秒单位设置

usleep() 函数 将阻止调用线程继续运行程序,直到指定的 useconds 参数所表示的实际微秒数过去,或者调用线程收到信号。届时,它将调用信号处理函数或终止进程。由于系统调度其他活动,挂起时间可能会比请求的时间长。useconds 参数应小于 1,000,000。如果 useconds 设置为 0,则调用无效。

如果在 usleep() 函数 执行期间,为调用进程生成了 SIGALRM 信号,并且该信号被忽略或阻止传递,那么 usleep() 函数是否会返回,尚不清楚。另外,如果在阻止该信号后 usleep() 返回,该信号是被丢弃还是保留待处理,也尚不清楚。

如果在 usleep() 执行期间,为调用进程生成了 SIGALRM 信号(非由于先前调用 alarm()),并且该信号未被忽略或阻止传递,则除了导致 usleep() 返回之外,是否还会有其他影响,尚不清楚。

如果一个信号处理函数中断了 usleep(),并检查或修改了 SIGALRM 信号的计划创建时间、与 SIGALRM 信号关联的操作,或者 SIGALRM 信号是否被阻止传递,那么结果是未定义的。

如果一个信号处理函数中断了 usleep() 函数,并调用 siglongjmp()longjmp() 函数来恢复在调用 usleep() 函数之前保存的环境,那么与 SIGALRM 信号关联的操作以及 SIGALRM 信号的计划生成时间都是未定义的。此外,是否 SIGALRM 信号会被抑制,直到环境也恢复线程的信号掩码,尚不清楚。

计时器值的粒度可能受实现方式的限制。对于每个间隔计时器,如果请求的计时器值所需的粒度比实现提供的更精细,则实际计时器值必须向上舍入到下一个支持的值。

C 语言中 usleep() 函数的语法

它具有以下语法:

使用 useconds_t 类型的无符号整数。如果成功,则返回 0;如果失败,则返回 -1。可用值的范围是 0999,999 微秒微秒值是可接受的。

返回值

如果 Usleep() 函数成功,则应返回 0;否则,它应返回 -1 并设置 errno 来指示错误。

示例

让我们通过一个示例来演示 C 语言中的 usleep() 函数

输出

Start of program
[2-second delay]
End of program

说明

对于 usleep() 函数标准输入/输出例程,我们添加了必需的头文件,stdio.hunistd.h

程序开始后,控制台会立即打印 "程序开始"。我们调用 usleep(2000000) 来在程序执行中添加2 秒(2,000,000 微秒)的延迟。

程序在延迟后恢复,并在控制台打印 "程序结束"。由于系统调度和其他因素,实际延迟时间可能不精确;因此,它更适合短暂延迟,而不是精确计时。此外,usleep() 函数是一个 POSIX 标准函数,可能并非在所有系统上都可用。如果出现可移植性问题,请考虑使用其他特定于平台的例程,例如 Windows 上的 Sleep()POSIX 系统上的 nanosleep()

示例

输出

Countdown starting...
1
2
3
4
5
Countdown completed!

说明

  • 程序启动后,控制台会打印 "倒计时开始..."。之后,我们使用for 循环显示从 15 的数字。
  • 接下来,我们在循环中使用 printf() 函数来显示循环变量 i 的当前值。
  • 我们在显示每个数字后使用 usleep(1000000);来添加1 秒的延迟。因此,在每次显示数字之间会有一的间隔。
  • 循环结束后,我们向终端打印 "倒计时完成!"
  • 当程序显示数字 15 时,每个数字之间会有一个一秒的暂停。这是使用 usleep() 添加程序延迟的一个更简单的示例。