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