我正在使用Linux中的USB小工具将一个分区作为可移动的g_file_storage海量存储设备导出到主机PC (Windows、Linux、MAC)。
所有这些主机操作系统(可以)自动挂载可移动磁盘并毫无问题地访问它,我正在寻找一种方法来检测主机是否已弹出/卸载磁盘。
到目前为止,我发现的唯一方法仅限于Windows XP。当用户选择“安全移除硬件”时,XP会将USB设备置于挂起模式,该模式可在远程端检测到。由于某些原因,这在Vista中不起作用。
发布于 2009-09-07 21:31:39
我也遇到过这个问题。
我的嵌入式USB只读大容量存储项目监视来自主机的SCSI命令。对于Mac (10.5):在插件上,OS驱动程序会很好地告诉设备防止介质移除(SCSI命令防止/允许介质移除)。我的设备接受此命令。稍后,当用户发出应该弹出设备的信号时,OS X将再次发送带有ALLOW标志的阻止/允许删除,然后发送SCSI START/STOP指示停止(或弹出,无法记住)。漂亮的。
但是,Windows XP似乎只是停止发送SCSI命令TEST UNIT READY。我观察到,“安全删除硬件”没有发送任何SCSI信号,它只是导致测试单元就绪信号停止出现,它每秒都在这样做。基本上,Windows只是沉默不语。
测试单元就绪超时可以在Windows下工作,但它不是一种检测设备停止条件的糟糕方法。此外,它不会在OS X上工作,因为OS X不会像Windows那样每秒since我的设备;我会得到一个假阳性。
更新2009年11月15日
桑德加德向你报告。
这在很大程度上取决于设备对USB大容量存储类SCSI“查询”命令的响应本身是“可移动的”还是“固定的”。
如果标志显示为removable,我可以判断Windows XP用户是否已“停止”我的设备的唯一方法就是每秒停止执行测试单元就绪命令。如果该标志没有显示可移除,则没有常规的测试单元就绪命令流。USB暂停也不能指望,在我的测试中,大约1/4的“安全删除”没有发送USB暂停。不知道为什么不一致。因此,如果你想要确定,我所能做的最好的建议仅仅是为了与WINDOWS XP兼容,将查询响应为“可移除的”,寻找常规的测试单元就绪命令,然后当它们停止时,就认为你自己被安全地移除了。
OS (10.6)则是另一回事。正如我在上面写的,它更有礼貌。它发送SCSI START/STOP来启动或关闭设备,有时完全独立,无需用户输入。但这意味着,如果你将STOP解释为用户已经结束,并以任何丑陋的方式断开设备内部的连接,那么当OS X试图再次旋转磁盘时,它可能会变得非常困惑。如果你的设备被标记为可移动,OS X将在停止之前发送一个允许删除命令(或者在这种情况下是弹出的吗?),这将是一个很好的迹象,表明它是通过的。
我没有详尽地尝试不同的配置。我的应用程序是只读的,有两个分区,必须标识为不可移动,因为Windows XP拒绝为可移动USB驱动器确认多个分区(OS X无论哪种方式都没有问题)。所以我的大部分测试都是在这个配置中进行的。
希望这能有所帮助。
发布于 2009-08-29 14:05:30
遗憾的是,我不能给出解决方案,因为我对这个主题并不是很熟悉,但几乎没有什么建议。
但是,你可以开始检查解决方案的选择很少。
发布于 2009-08-28 09:59:27
我不认为主机操作系统必须向小工具发送任何信号。我对弹出操作的理解是,主机操作系统不再与小工具有任何关系。
https://stackoverflow.com/questions/1345901
复制相似问题