usb挂起与文件描述符

news/2026/1/26 8:14:38/文章来源:https://www.cnblogs.com/FBsharl/p/19530901

问题分析

当 USB 设备挂起时,已经打开的文件描述符通常不会自动关闭,这是因为:

  1. 文件描述符是内核资源:即使底层硬件不可用,文件描述符仍存在于进程中

  2. 引用计数机制:只要进程持有引用,描述符就不会自动释放

  3. USB 挂起 ≠ 设备移除:挂起是电源管理状态,设备仍在系统总线上

可能的原因

1. 描述符状态变化

// 典型的现象
int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
// 挂起 USB 设备
system("echo suspend > /sys/bus/usb/devices/X-X/power/level");
// fd 仍然有效,但 I/O 操作会失败或阻塞

2. 检查描述符状态的几种方法

# 查看文件描述符信息
ls -l /proc/<PID>/fd/
ls -l /proc/<PID>/fdinfo/# 查看 USB 设备状态
lsusb -t
cat /sys/bus/usb/devices/X-X/power/runtime_status

3. 程序示例:检测挂起状态

c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>
#include <linux/serial.h>int check_port_status(int fd) {struct serial_struct serinfo;if (ioctl(fd, TIOCGSERIAL, &serinfo) < 0) {perror("TIOCGSERIAL failed");return -1;}// 检查端口状态printf("Port type: %d\n", serinfo.type);printf("Port flags: 0x%x\n", serinfo.flags);return 0;
}int main() {int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);if (fd < 0) {perror("open failed");return 1;}printf("Descriptor opened: fd=%d\n", fd);// 尝试读取(可能会阻塞或失败)char buf[10];int n = read(fd, buf, sizeof(buf));if (n < 0) {printf("Read failed: %s (errno=%d)\n", strerror(errno), errno);}close(fd);return 0;
}

解决方案

方案1:监控 USB 事件并重新初始化

c
// 使用 udev 监控 USB 事件
#include <libudev.h>
#include <poll.h>void monitor_usb_events() {struct udev *udev = udev_new();struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev");udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", NULL);udev_monitor_enable_receiving(mon);int fd = udev_monitor_get_fd(mon);struct pollfd pfd = {.fd = fd, .events = POLLIN};while (1) {poll(&pfd, 1, -1);if (pfd.revents & POLLIN) {struct udev_device *dev = udev_monitor_receive_device(mon);const char *action = udev_device_get_action(dev);const char *syspath = udev_device_get_syspath(dev);printf("USB event: %s on %s\n", action, syspath);if (strcmp(action, "suspend") == 0) {// 处理挂起事件handle_suspend_event();} else if (strcmp(action, "resume") == 0) {// 处理恢复事件handle_resume_event();}udev_device_unref(dev);}}
}

方案2:使用非阻塞模式和超时

c
// 设置非阻塞 I/O 和超时
int setup_serial_timeout(int fd) {// 设置非阻塞int flags = fcntl(fd, F_GETFL, 0);fcntl(fd, F_SETFL, flags | O_NONBLOCK);// 设置超时struct termios options;tcgetattr(fd, &options);options.c_cc[VMIN] = 0;      // 最小字符数options.c_cc[VTIME] = 10;    // 超时(1秒 = 10*0.1秒)tcsetattr(fd, TCSANOW, &options);return 0;
}

方案3:完整的重连机制

c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/epoll.h>#define MAX_EVENTS 10typedef struct {int fd;char device[64];int connected;
} serial_port_t;void reconnect_port(serial_port_t *port) {if (port->fd >= 0) {close(port->fd);port->fd = -1;}int retries = 5;while (retries-- > 0) {port->fd = open(port->device, O_RDWR | O_NOCTTY | O_NONBLOCK);if (port->fd >= 0) {printf("Reconnected to %s\n", port->device);port->connected = 1;// 重新配置串口参数struct termios options;tcgetattr(port->fd, &options);cfsetispeed(&options, B9600);cfsetospeed(&options, B9600);tcsetattr(port->fd, TCSANOW, &options);break;}sleep(1);}if (port->fd < 0) {fprintf(stderr, "Failed to reconnect to %s\n", port->device);port->connected = 0;}
}int main() {serial_port_t port = {.fd = -1,.device = "/dev/ttyUSB0",.connected = 0};// 初始连接reconnect_port(&port);int epoll_fd = epoll_create1(0);struct epoll_event ev, events[MAX_EVENTS];ev.events = EPOLLIN | EPOLLERR | EPOLLHUP;ev.data.fd = port.fd;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, port.fd, &ev);while (1) {int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, 1000);for (int i = 0; i < nfds; i++) {if (events[i].events & EPOLLHUP) {printf("Device disconnected or suspended\n");port.connected = 0;reconnect_port(&port);}if (events[i].events & EPOLLIN) {char buffer[256];ssize_t n = read(port.fd, buffer, sizeof(buffer));if (n > 0) {// 处理数据} else if (n < 0 && errno != EAGAIN) {// 错误处理port.connected = 0;reconnect_port(&port);}}}}return 0;
}

建议的调试步骤

  1. 确认挂起状态

    bash
    cat /sys/bus/usb/devices/<bus>-<port>/power/runtime_status
  2. 监控内核消息

    bash
    dmesg -w
    # 或
    journalctl -f -k
  3. 测试文件描述符

    bash
    # 检查文件描述符是否还有效
    ls -l /proc/self/fd/3
    stat /proc/self/fd/3
  4. 使用 strace 跟踪

    bash
    strace -e openat,close,read,write -p <PID>

最佳实践

  1. 总是检查 I/O 操作的返回值

  2. 实现超时和重试机制

  3. 使用非阻塞模式或 select/poll/epoll

  4. 监控 udev 事件来响应硬件状态变化

  5. 实现优雅的重连逻辑

文件描述符在 USB 挂起时不会自动消失是正常行为,你需要主动检测和处理挂起/恢复事件,并实现相应的错误恢复机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1218011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析:从入门到实操:贝叶斯分析完整技术步骤与核心R包指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2026年靠谱的欧式起重机/无尘起重机厂家推荐及选购指南

在工业设备采购中,选择一家可靠的欧式起重机或无尘起重机供应商至关重要。本文基于产品技术成熟度、市场占有率、客户反馈及售后服务网络等核心指标,筛选出2026年度值得关注的5家专业厂家。其中,上海奥展起重机械凭…

手机也能用!FSMN-VAD移动端适配实测

手机也能用&#xff01;FSMN-VAD移动端适配实测 你有没有遇到过这样的场景&#xff1a;在会议录音后想快速提取发言内容&#xff0c;却要花半小时手动剪掉静音&#xff1b;或者给智能设备做语音唤醒&#xff0c;发现环境稍一嘈杂就频繁误触发&#xff1f;这时候&#xff0c;一…

小白也能用!SenseVoiceSmall镜像实现AI语音情绪识别实战

小白也能用&#xff01;SenseVoiceSmall镜像实现AI语音情绪识别实战 你有没有遇到过这样的场景&#xff1a;客服录音里客户语气明显不耐烦&#xff0c;但文字转录只显示“请尽快处理”&#xff0c;漏掉了关键的情绪信号&#xff1f;或者短视频配音中背景笑声和BGM混在一起&…

FSMN-VAD性能实测:高召回率让语音不漏检

FSMN-VAD性能实测&#xff1a;高召回率让语音不漏检 语音端点检测&#xff08;Voice Activity Detection&#xff0c;VAD&#xff09;看似只是音频处理链条中一个不起眼的环节&#xff0c;但实际却是整个语音识别系统能否稳定运行的“守门人”。一段10分钟的会议录音里&#x…

YOLO11部署避坑指南:新手常遇问题全解析

YOLO11部署避坑指南&#xff1a;新手常遇问题全解析 你是不是也经历过&#xff1a;镜像拉下来了&#xff0c;Jupyter能打开&#xff0c;但一跑train.py就报错&#xff1f;模型权重放对位置了&#xff0c;却提示FileNotFoundError: yolo11s.pt&#xff1f;SSH连上了&#xff0c;…

无需代码!Qwen-Image-Edit-2511在线平台使用全攻略

无需代码&#xff01;Qwen-Image-Edit-2511在线平台使用全攻略 你是不是也遇到过这些情况&#xff1a;想给产品图换一个高级感背景&#xff0c;结果人物脸型变了&#xff1b;想把设计稿转成线框图&#xff0c;生成的结构歪七扭八&#xff1b;想批量修改一组人像的服装风格&…

半加器电路设计:新手教程(从零实现)

以下是对您提供的博文《半加器电路设计&#xff1a;从原理到实现的工程化解析》进行 深度润色与结构重构后的专业级技术文章 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹 &#xff1a;语言自然、节奏有呼吸感&#xff0c;像一位在FPGA实验室泡了十年的…

2026年热门的超低压抗污染反渗透膜/极低压抗污染反渗透膜厂家推荐及选择指南

在反渗透膜技术领域,选择优质的超低压抗污染反渗透膜/极低压抗污染反渗透膜供应商需要综合考虑技术创新能力、实际应用案例、产品稳定性和企业可持续发展理念。根据2026年行业技术发展趋势和市场需求变化,本文推荐五…

2026年比较好的铁盒定制/坚果铁盒厂家最新权威推荐排行榜

在金属包装行业,选择一家可靠的铁盒定制厂家至关重要,尤其是对于坚果、食品等对包装要求较高的产品。本文基于企业规模、技术实力、生产工艺、客户口碑及市场反馈等维度,综合评估筛选出2026年值得推荐的5家铁盒定制…

2026年靠谱的化工厂清淤机器人/水下清淤机器人厂家推荐及选购参考榜

在化工厂、污水处理厂等工业场景中,清淤作业环境复杂、危险性高,传统人工清淤效率低且存在安全隐患。随着技术进步,水下清淤机器人凭借高效、安全、智能等优势逐渐成为行业。本文基于技术实力、产品性能、市场应用及…

详细介绍:从单线程到线程池:TCP服务器并发处理演进之路

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:图解向量的加减

完整教程:图解向量的加减pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

嵌入式实时系统中可执行文件的启动时间优化方法

以下是对您提供的技术博文进行 深度润色与重构后的版本 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹 &#xff1a;语言自然、有“人味”&#xff0c;像一位资深嵌入式系统架构师在和同行面对面分享实战经验&#xff1b; ✅ 打破模板化结构 &#xf…

ERNIE系列的详细讨论 / Detailed Discussion of the ERNIE Series

ERNIE系列的详细讨论 / Detailed Discussion of the ERNIE Series引言 / IntroductionERNIE&#xff08;Enhanced Representation through kNowledge IntEgration&#xff09;系列是由百度开发的知识增强预训练语言模型&#xff08;LLM&#xff09;家族&#xff0c;自2019年问世…

GLM系列的详细讨论 / Detailed Discussion of the GLM Series

GLM系列的详细讨论 / Detailed Discussion of the GLM Series引言 / IntroductionGLM&#xff08;Generative Language Model&#xff09;系列是由智谱AI&#xff08;Zhipu AI&#xff0c;前身为清华大学的THUDM实验室&#xff09;开发的开源多语言多模态大型语言模型&#xff…

Zephyr在可穿戴设备中的电源管理应用:案例研究

以下是对您提供的博文《Zephyr在可穿戴设备中的电源管理应用&#xff1a;技术深度解析》进行全面润色与结构重构后的专业级技术文章。优化目标包括&#xff1a;✅ 彻底消除AI生成痕迹&#xff0c;强化“人类专家口吻”与实战经验感✅ 打破模板化章节标题&#xff0c;以自然逻辑…

高速信号设计中USB接口类型的实战案例

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。我以一位深耕高速信号完整性&#xff08;SI&#xff09;与USB协议栈多年的嵌入式系统架构师视角&#xff0c;彻底重写全文—— 去除所有AI痕迹、模板化表达与空泛总结&#xff0c;代之以真实项目中的血…

HBuilderX运行网页报错?通俗解释底层机制与修复路径

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI生成痕迹&#xff0c;采用真实开发者口吻、教学式逻辑推进、问题驱动的叙述节奏&#xff0c;并融合一线调试经验与底层机制洞察。所有技术细节严格基于HBuilderX实际行为&#xff08;结…

2026年靠谱的工业高速摄像机/科研高速摄像机厂家最新热销排行

在工业检测、科研实验和高端制造领域,高速摄像机已成为不可或缺的精密观测工具。本文基于2026年市场调研数据,从技术创新能力、产品稳定性、行业应用案例三个维度,对当前国内工业高速摄像机/科研高速摄像机领域的主…