目录
在Linux中,进程休眠(sleep)是指进程暂停执行一段时间。常用的休眠函数包括sleep
、usleep
和nanosleep
。它们的主要区别在于指定休眠时间的精度。
1、sleep函数
sleep
函数使进程休眠指定的秒数。其原型为:
unsigned int sleep(unsigned int seconds);
- 参数:
seconds
是进程休眠的时间,以秒为单位。 - 返回值:实际休眠的秒数(如果信号中断了休眠,则返回剩余的秒数)。
示例如下:
#include <unistd.h>
#include <stdio.h>
int main() {
printf("Sleeping for 5 seconds...\n");
sleep(5);
printf("Awake!\n");
return 0;
}
2、usleep函数
usleep
函数使进程休眠指定的微秒数。其原型为:
int usleep(useconds_t usec);
- 参数:
usec
是进程休眠的时间,以微秒为单位(1秒 = 1,000,000微秒)。 - 返回值:0表示成功,-1表示失败。
示例如下:
#include <unistd.h>
#include <stdio.h>
int main() {
printf("Sleeping for 500,000 microseconds (0.5 seconds)...\n");
usleep(500000);
printf("Awake!\n");
return 0;
}
3、nanosleep函数
nanosleep
函数使进程休眠指定的纳秒数。其原型为:
int nanosleep(const struct timespec *req, struct timespec *rem);
参数:
req
:指向一个timespec
结构体,指定休眠时间。rem
:指向一个timespec
结构体,如果休眠被信号中断,则此结构体保存剩余的时间。
返回值:0表示成功,-1表示失败,并设置errno。
timespec
结构体定义如下:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
示例如下:
#include <time.h>
#include <stdio.h>
int main() {
struct timespec req, rem;
req.tv_sec = 0;
req.tv_nsec = 500000000L; // 500 milliseconds
printf("Sleeping for 500,000,000 nanoseconds (0.5 seconds)...\n");
if (nanosleep(&req, &rem) == -1) {
printf("Nanosleep was interrupted\n");
}
printf("Awake!\n");
return 0;
}
4、注意事项
- 精度:
sleep
的精度最低,以秒为单位;usleep
以微秒为单位,精度稍高;nanosleep
以纳秒为单位,精度最高。 - 中断:如果休眠期间进程接收到信号,休眠可能会被中断,可以通过返回值判断是否被中断,并在需要时重新调用休眠函数。
这三个函数提供了不同精度和功能的休眠方式,根据实际需求选择合适的函数。