在Linux下假设以下情况:
进程持续从USB串行转换器设备(/dev/ttyUSB0
)读取。该设备突然拔掉并再次插入(或由于某种原因重置自身)。该过程继续为/dev/ttyUSB0
提供有效的文件句柄,但不会从设备接收任何数据,除非该过程重新打开设备(因为 udev 已删除并重新创建设备节点)。
是否有直接方法来检测这种情况(即不通过检测数据流中的超时间接),以便进程知道它必须重新打开设备?使用/dev/ttyUSB0
监控stat()
的修改时间是否可靠?
其他详情:
该过程使用标准open()
函数打开设备文件。
/dev
是由tmpfs
控制的udev
。
注意:我不想要使用任何 udev 规则并且更喜欢在此过程中直接实施的解决方案。
答案 0 :(得分:1)
如果USB设备被热插拔,设备上的操作将以-EIO
开始失败;你可以检测到这一点并采取适当的行动。
答案 1 :(得分:1)
如果设备节点实际被删除并重新创建(我相信如果你有udev),那么你应该能够使用inode号来判断这种情况何时发生。
只需在fstat()
上的打开文件描述符stat()
上调用/dev/ttyUSB0
,然后比较两个st_ino
的{{1}}字段。
让我知道它是否真的有效。 : - )
答案 2 :(得分:0)
我认为FAM
或gamin
会检测到这些事件。