You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正确轮询libusb_pollfd结构体列表的方法:用poll还是libusb函数?

正确轮询libusb_pollfd列表的方式

你不需要修改标准的poll()函数,有两种实用的处理方式:

1. 手动转换结构体后调用标准poll()

libusb_pollfd的字段刚好对应pollfd的前两个成员,直接转换后就能用标准poll():

// 假设已获取libusb_pollfd列表及长度
struct libusb_pollfd *usb_fds;
int num_fds;

// 分配pollfd数组内存
struct pollfd *poll_fds = malloc(num_fds * sizeof(struct pollfd));
if (!poll_fds) {
    // 处理内存分配失败逻辑
}

// 逐个转换结构体
for (int i = 0; i < num_fds; i++) {
    poll_fds[i].fd = usb_fds[i].fd;
    poll_fds[i].events = usb_fds[i].events;
    poll_fds[i].revents = 0; // 初始化返回事件字段
}

// 调用标准poll函数
int ret = poll(poll_fds, num_fds, timeout);

// 轮询完成后,遍历poll_fds的revents字段,将有事件的fd传给libusb_handle_events类函数处理
// ...

// 释放内存
free(poll_fds);

2. 使用libusb封装好的专用函数

如果不想手动处理poll逻辑,libusb提供了直接处理事件的封装函数,内部会自动完成fd轮询和事件分发:

  • libusb_handle_events():阻塞等待并处理事件,直到有事件或被中断
  • libusb_handle_events_timeout():带超时时间的事件处理
  • libusb_handle_events_completed():支持传入完成回调的版本

示例代码:

struct timeval timeout = {1, 0}; // 1秒超时
int ret = libusb_handle_events_timeout(ctx, &timeout);

总结

  • 无需修改标准poll(),手动转换结构体即可兼容使用
  • 优先推荐libusb自带的事件处理函数,减少手动编码量和出错概率

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:55:11