正确轮询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
相关产品推荐
相关产品推荐

