我有一个程序,它会在计算机运行时始终运行。它与串行USB设备连接。有时,当计算机开启时,设备可能不存在。
我的问题是确认设备文件何时出现的好方法。我可以创建一个无限循环,持续检查文件,假设我知道它的名字会在它获得fd时中断。但是,还有比这更好的方法吗?
此外,假设在程序运行时设备被拔掉,我的fd现在变得无效。发生这种情况时会抛出一些事件或错误,所以我可以再次开始检查,直到设备文件再次出现?
我使用select循环从fd读取。
答案 0 :(得分:2)
在Linux上,当使用udev
插入或删除设备时,可以通知您的应用程序。
有一个很好的例子,请看一下这个通知程序:udev-notify
libudev API将允许您收听内核事件,并在设备可用或被删除时收到通知,然后您可以决定何时发生此类事件。
答案 1 :(得分:0)
历史上,轮询的解决方案(确定所述“文件”是否以某个间隔存在的循环)将是“最佳”的解决方案。如果您使用的是现代Linux(2.6.12+,但未指定),则可以使用inotify,它可能完全符合您的要求 - 监视目录以创建文件(IN_CREATE)。我链接的维基百科文章提供了非常好的概述和有用的链接。
它被拔掉的部分很棘手。当文件在* nix中删除时(可以追溯到很久以前),它的文件描述符仍然有效。因此我猜想extern int errno;
可能是你的解决方案;你的帖子被标记为“C”,所以没有什么可以“抛出”但如果你在read
(或其他)呼叫失败时检查这一点,你就可以获得洞察力。
同时查看libudev,这当然更具体的设备,而不是* nix的一般“一切都是文件”的哲学。