【问题标题】:pen drive removed while copying files复制文件时删除了笔式驱动器
【发布时间】:2023-04-06 08:21:01
【问题描述】:

我正在用 C 语言编程(在嵌入式环境中)。 USB 可以连接到该设备。现在,当我通过我的代码将文件从 USB 复制到该设备时,如果有人移除了 pendrive,那么我们如何检测到 pendrive 的移除或如何处理这种情况。

设备架构:ARM、Linux平台

我可以通过比较源中的文件大小和应该复制的目标来检查文件是否被完全复制。 但是请让我知道任何其他方法来确保文件被成功复制(如果在两者之间删除了pendrive)。我是这样复制的:

 sprintf(str, "cp %s%s /mnt/disk/.;sync", FILE_OP_PATH, name);
 96                 system(str);

【问题讨论】:

  • 您会收到设备连接/移除的热插拔阻止事件。这些可以触发挂载/卸载,在这种情况下,您还可以了解如何挂钩它们以进行清理。

标签: c linux filesystems embedded


【解决方案1】:

如果源设备突然丢失,您正在执行的系统调用(直接或间接通过标准库)将会失败。

如果您使用普通的旧 @987654321@ 从 USB 驱动器读取数据,我认为它会失败并将 errno 设置为 EIO,如文档所述:

当从磁盘或磁带读取时出现低级 I/O 错误时,也可能发生这种情况。

对我来说,在读取过程中强制卸载驱动器听起来像是“低级 I/O 错误”。

首先按照上面的方法检测故障可能是最简单的方法,当然您的复制代码已经可以做到,然后作为后续尝试提出错误并导致错误的诊断,您可以可能检查安装台,看看设备是否还在。

【讨论】:

    【解决方案2】:

    这是一个低级错误,文件系统也将处于不干净状态,也应进行验证。

    这是预期的操作方法还是更罕见的类似错误的事件?

    如果是测试用例,只需确保您的代码不会爆炸或执行其他奇怪的事情,例如无限循环重试写入。设备上的文件系统也可能处于不干净的状态,因为你在说 USB 我在想 VFAT。可能会报告错误的文件大小。

    【讨论】:

    • 如果 USB 设备只是被读取,我认为它应该是相当安全的。不过,您可能想调查文件系统是否进行任何访问时间跟踪。
    • @unwind:读取的好点,以只读方式安装它会使程序非常安全。但我读了它,因为它是写操作。
    • @john:那么我认为只需处理这种情况并对返回的驱动器进行长度/校验和验证就可以了。您可能需要考虑写入缓存,可能是您根本没有将数据传输到 USB 存储器。
    【解决方案3】:

    虽然我的解决方案很慢,你可以尝试if(fopen("myfile", "r")!=NULL)every 复制:)

    【讨论】:

      【解决方案4】:

      您可以使用和配置udev,以便在 USB 端口上插入或拔出某些东西时收到通知。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-25
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 1970-01-01
        • 2017-10-17
        • 2014-01-09
        相关资源
        最近更新 更多