C语言暂停函数详解:sleep(), pause(), nanosleep() 的用法与区别71


在 C 语言编程中,经常需要程序暂停执行一段时间,例如等待用户输入、控制程序运行节奏或进行同步操作。实现暂停功能的方法有多种,其中最常用的函数包括 `sleep()`、`pause()` 和 `nanosleep()`。本文将详细介绍这三个函数的用法、区别以及一些需要注意的问题,帮助读者选择最合适的暂停函数。

1. `sleep()` 函数

`sleep()` 函数是 POSIX 标准中定义的函数,用于暂停程序的执行指定秒数。其函数原型如下:```c
#include
unsigned int sleep(unsigned int seconds);
```

该函数接受一个 `unsigned int` 类型的参数,表示暂停的秒数。函数返回 0 表示成功暂停指定时间,如果被信号中断,则返回剩余未暂停的秒数。

示例:```c
#include
#include
int main() {
printf("程序开始执行...");
sleep(5); // 暂停 5 秒
printf("程序继续执行...");
return 0;
}
```

这个例子中,程序会打印 "程序开始执行...",然后暂停 5 秒,最后打印 "程序继续执行..."。

2. `pause()` 函数

`pause()` 函数也是 POSIX 标准中定义的函数,它会暂停程序的执行,直到接收到一个信号为止。其函数原型如下:```c
#include
int pause(void);
```

该函数不接受任何参数,返回值始终为 -1,并且设置 `errno` 为 `EINTR` (Interrupted system call),表示该函数被信号中断。 `pause()` 函数通常用于等待特定信号的到来,例如,在编写信号处理程序时,可以利用 `pause()` 函数使程序进入休眠状态,直到接收到预期的信号。

示例:```c
#include
#include
#include
#include
void handler(int sig) {
printf("收到信号 %d", sig);
}
int main() {
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL); // 注册 SIGINT 信号的处理函数
printf("程序正在等待信号...");
pause(); // 暂停直到收到信号
printf("程序继续执行...");
return 0;
}
```

在这个例子中,程序会注册一个 SIGINT (Ctrl+C) 信号的处理函数,然后调用 `pause()` 函数等待信号。当用户按下 Ctrl+C 时,程序会打印 "收到信号 2",然后继续执行。

3. `nanosleep()` 函数

`nanosleep()` 函数提供了比 `sleep()` 函数更精细的时间控制,它可以暂停程序执行指定的时间,精度达到纳秒级。其函数原型如下:```c
#include
int nanosleep(const struct timespec *req, struct timespec *rem);
```

该函数接受两个 `struct timespec` 类型的参数:`req` 指定要暂停的时间,`rem` 指向一个 `struct timespec` 结构体,用于返回剩余未暂停的时间。`struct timespec` 结构体定义如下:```c
struct timespec {
time_t tv_sec; // 秒
long tv_nsec; // 纳秒
};
```

如果 `nanosleep()` 函数成功执行,则返回 0;如果被信号中断,则返回 -1,并将剩余未暂停的时间写入 `rem` 指针指向的结构体中。如果`req`指定的时间为0,`nanosleep`会立即返回。

示例:```c
#include
#include
int main() {
struct timespec req, rem;
req.tv_sec = 1;
req.tv_nsec = 500000000; // 0.5 秒
printf("程序开始执行...");
nanosleep(&req, &rem);
printf("程序继续执行...");
return 0;
}
```

这个例子中,程序会暂停 1.5 秒。

4. 三个函数的区别总结

| 函数 | 精度 | 暂停条件 | 返回值 |
| -------- | -------- | --------------------------- | ------------------------------------- |
| `sleep()` | 秒 | 指定秒数 | 剩余未暂停秒数或 0 |
| `pause()` | 无 | 接收到信号 | -1 (EINTR) |
| `nanosleep()` | 纳秒 | 指定时间 (秒和纳秒) | 0 或 -1 (EINTR), 剩余未暂停时间写入rem |

5. 注意事项

* `sleep()` 函数的精度只有秒级,对于需要更精确时间控制的场合,应使用 `nanosleep()` 函数。
* `pause()` 函数通常用于等待信号,不适合用于简单的程序暂停。
* 所有这些函数都可能被信号中断。 如果需要实现不被信号中断的暂停,需要使用更高级的技术,例如信号屏蔽。

通过本文的介绍,相信读者对 C 语言中的暂停函数有了更深入的理解,可以根据实际需求选择合适的函数来实现程序的暂停功能。

2025-05-22


上一篇:C语言memcpy函数详解:用法、效率及安全注意事项

下一篇:C语言字符输出详解:深入剖析字符‘d‘的打印方式及相关技巧