Linux下使用select延时

本文探讨了在Linux环境下实现精确延时的技术细节。传统的sleep函数因易受中断和信号影响而不适用于需要高精度延时的场景。文章深入介绍了使用select函数进行毫秒级延时的实践,提供了一个具体示例,并提醒开发者注意处理EINTR错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在LINUX用户态的情况下,如果想要延时的话,可以使用用sleep函数,但是在一些情况下,需要更小单位的延时,ms/us 也是要的。用循环获取到的延时是不精确的。

  • sleep是不准确,这个函数是可以中断的;

  • sleep容易受到系统信号,例如SIGALRM影响,各个系统版本实现不一,sleep是个glic库函数,不是系统调用;

 

  

使用如下:

fd_set rfds;
struct timeval tv;
int retval;

/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);

/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;

retval = select(1, &rfds, NULL, NULL, &tv);

  上面的例程没有处理EINTR的情况,实际使用中需要考虑。

转载于:https://www.cnblogs.com/coder-zyc/p/10001396.html

### Linux 延时函数的使用方法 在Linux系统中,延时函数可以分为 **用户空间延时函数** 和 **内核空间延时函数** 两种类型。不同的场景下应选择合适的延时函数以满足时间精度和资源占用的需求。 #### 用户空间延时函数 适用于应用程序开发,主要包含以下几种: 1. `sleep(unsigned int seconds)` - 功能:使进程休眠指定的秒数。 - 精度:秒级。 - 示例: ```c sleep(2); // 延时2秒 ``` 2. `usleep(unsigned long usec)` - 功能:使进程休眠指定的微秒数。 - 精度:微秒级(1秒=1,000,000微秒)。 - 示例: ```c usleep(1000000); // 延时1秒 ``` 3. `nanosleep(const struct timespec *req, struct timespec *rem)` - 功能:提供纳秒级别的高精度延时。 - 精度:纳秒级(1秒=1,000,000,000纳秒)。 - 示例: ```c struct timespec ts = {1, 500000000}; // 1秒500,000,000纳秒 nanosleep(&ts, NULL); ``` 4. `select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)` - 功能:通过设置超时参数实现延时。 - 精度:微秒级。 - 示例: ```c struct timeval tv = {2, 0}; // 2秒 select(0, NULL, NULL, NULL, &tv); ``` 5. `pselect(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t *sigmask)` - 功能:类似于`select`,但支持更精确的超时控制(纳秒级)。 - 精度:纳秒级。 - 示例: ```c struct timespec ts = {1, 500000000}; // 1秒500,000,000纳秒 pselect(0, NULL, NULL, NULL, &ts, NULL); ``` #### 内核空间延时函数 适用于编写设备驱动程序或内核模块,主要包括以下几种: 1. `ndelay(unsigned long nsecs)` - 功能:纳秒级别的忙等待延时。 - 精度:纳秒级。 - 适用范围:短时间延时(通常小于几纳秒)。 - 示例: ```c ndelay(100); // 延时100纳秒 ``` 2. `udelay(unsigned long usecs)` - 功能:微秒级别的忙等待延时。 - 精度:微秒级。 - 适用范围:短时间延时(通常小于200微秒)。 - 示例: ```c udelay(100); // 延时100微秒 ``` 3. `mdelay(unsigned long msecs)` - 功能:毫秒级别的忙等待延时。 - 精度:毫秒级。 - 适用范围:较长时间延时(通常大于200微秒)。 - 示例: ```c mdelay(100); // 延时100毫秒 ``` 4. `ssleep(unsigned int seconds)` - 功能:秒级别的睡眠延时。 - 精度:秒级。 - 优点:不占用CPU资源。 - 缺点:时间精度较低。 - 示例: ```c ssleep(2); // 延时2秒 ``` 5. `msleep(unsigned int msecs)` - 功能:毫秒级别的睡眠延时。 - 精度:毫秒级。 - 优点:不占用CPU资源。 - 缺点:时间精度较低。 - 示例: ```c msleep(100); // 延时100毫秒 ``` #### 使用建议 - **对于高精度要求**:优先使用`nanosleep`或内核中的`ndelay`、`udelay`等函数。 - **对于低精度要求**:使用`sleep`、`usleep`、`ssleep`、`msleep`等函数。 - **避免长时间忙等待**:忙等待会消耗大量CPU资源,适合短时间延时;长延时使用睡眠函数[^1]。 ### 示例代码 ```c #include <stdio.h> #include <unistd.h> int main(void) { int i = 10; while (i--) { sleep(2); // 延时2秒 printf("Sleep 2s!\n"); usleep(1000000); // 延时1秒 printf("Sleep 1000000us!\n"); } return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值