Linux使用select接口的高精确延时

使用select接口写高精确延时。

select接口

int select(int maxfdp, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

原理

  • 利用select的timeout参数实现定时器;
  • 设置timeval的值,而将其他参数都置为NULL,当内部时间耗尽后select便会退出。

示例

void usleep(unsigned long usec)
{
    struct timeval tv;
    tv.tv_sec = usec / 1000000;
    tv.tv_usec = usec % 1000000;

    int err;
    do {
        err = select(0, NULL, NULL, NULL, &tv);
    } while(err < 0 && errno == EINTR);
}

注意

  • 内核支持的延时分辨率一般不能达到微秒级;
  • 由于存在内核调度延时现象;
  • 内核分辨率一般为10ms的倍数。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Linux `select` 使用实例,用于监听标准输入和标准输出是否有数据可读写。 ```c #include <stdio.h> #include <stdlib.h> #include <sys/select.h> #include <unistd.h> int main() { fd_set rfds, wfds; // 用于存储文件描述符集合的 fd_set 结构体 int maxfd = STDIN_FILENO + 1; // 待监视的最大文件描述符值加一 struct timeval timeout = {5, 0}; // 时时间为 5 秒 while (1) { FD_ZERO(&rfds); // 将读文件描述符集合清零 FD_ZERO(&wfds); // 将写文件描述符集合清零 FD_SET(STDIN_FILENO, &rfds); // 将标准输入加入到读文件描述符集合 FD_SET(STDOUT_FILENO, &wfds); // 将标准输出加入到写文件描述符集合 // 调用 select 函数进行 I/O 多路复用 int ret = select(maxfd, &rfds, &wfds, NULL, &timeout); if (ret < 0) { perror("select error"); exit(1); } else if (ret == 0) { printf("timeout\n"); } else { // 判断标准输入是否可读 if (FD_ISSET(STDIN_FILENO, &rfds)) { char buf[1024]; int n = read(STDIN_FILENO, buf, sizeof(buf)); if (n < 0) { perror("read error"); exit(1); } else if (n == 0) { printf("EOF\n"); break; } else { printf("read: %s", buf); } } // 判断标准输出是否可写 if (FD_ISSET(STDOUT_FILENO, &wfds)) { char buf[1024] = "hello world\n"; int n = write(STDOUT_FILENO, buf, sizeof(buf)); if (n < 0) { perror("write error"); exit(1); } else { printf("write: %s", buf); } } } } return 0; } ``` 该程序通过 `FD_SET` 函数将标准输入和标准输出加入到读和写文件描述符集合中,然后调用 `select` 函数进行 I/O 多路复用。当标准输入可读或标准输出可写时,`select` 函数会返回,程序通过 `FD_ISSET` 函数判断哪个文件描述符可读或可写,并进行相应的读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值