如何以编程方式检测设备何时引发中断?

如何以编程方式检测设备何时引发中断?

如何以编程方式检测设备何时引发中断?这可能发生在设备连接或断开连接时。

还有这种情况:例如:当手指放在指纹扫描仪上时,会引发中断。如何检测并可能捕获此中断?

我想使用 Gtkmm 编写一个应用程序,这样当发生事件(例如插入 CD 或插入随身碟)时,我会捕获这些设备引发的中断,并使用它在我的应用程序中执行涉及这些设备的操作。

如果在 Gtkmm 中无法完成,我可以在较低级别捕获中断并通知 Gtkmm 应用程序吗?

我正在检查 GParted 的行为方式。它最初显示/dev/sda,当我连接我的随身碟时,它自动打开files应用程序。当我检查 GParted 时,设备的下拉菜单中不存在随身碟。仅当我在 GParted 菜单中选择“刷新设备”或Ctrl+时,它才会出现R

答案1

我可以尝试在较低级别捕获中断并通知 gtkmm 应用程序。

不,那是一个内核空间活动。幸运的是,内核确实通过可从用户空间访问的接口报告某些事件的结果。

您的问题有点含糊不清,是要检测何时连接块设备,还是何时安装文件系统(尽管似乎更倾向于前者)。如果您的系统使用自动挂载(通常默认情况下),它将在连接块设备时挂载文件系统,否则您必须手动执行此操作(例如,使用mount)。

无论哪种方式,您都想轮询/解析/扫描内核文件节点基于接口。我之前已经在一个应用程序(实际上是一个 C++ GTK 的应用程序)中完成了此操作,该应用程序通过/dev/和跟踪附加的块设备和挂载的文件系统/etc/mtab。这是一种简单的、与语言无关的方法。有些人一开始觉得有点反感,因为它涉及到读取文件/目录,但这些接口实际上并不存在于磁盘上,因此没有沉重的 I/O 开销,并且记住:read()是系统调用。读取内核接口中的文件节点与样式 API 相同listAttachedDevices(),只不过它与语言无关。当您从这些节点读取数据时,内核会直接向您传递它们所代表的信息。

/dev目录将附加设备列为特殊设备节点文件 - 例如/dev/sda.当设备插入和拔出时,它们会由内核添加和删除,因此如果您通过定期轮询(例如每 5 秒)来跟踪它,您可以检测到新增内容和已删除内容。这里唯一的复杂之处是,由于没有回调风格的 API,如果您确实想要连续检查,则必须为此创建自己的线程(也许为什么gparted需要您单击Refresh Devices)。

一个可能更好的替代方案/dev/sys/block.请注意,/dev/proc(见下文) 或之间存在显着差异,/sys 因为后者中的节点包含相关信息诸如设备之类的东西,而 中的节点/dev与设备的实际连接(因此,如果您扫描/dev,不必费心阅读各个文件,只需注意它们存在即可)。

/etc/mtab现在是一个符号链接(另请参阅)-s中的切换;是一个主要的瑞士军刀内核接口(参见 参考资料)。这列出了man ln/proc/self/mounts/procman proc挂载的文件系统;如果你使用自动挂载,当插入/拔出东西时,东西就会出现并消失。/proc和中的信息/sys通常是 ASCII 文本的形式,因此您可以使用cat、 等查看这些文件,并使用 string(stream) 函数对其进行解析。

WRT 对于其他类型的设备(例如指纹扫描仪)来说/sys是一个很好的起点——/sys/dev包含一个block和一个char目录。块设备通常是存储;关于他们的信息可以是随机访问。 Char 设备以流的形式与系统交换信息,其中包括扫描仪、摄像头、HID 设备(人机接口设备,例如鼠标和键盘)。我注意到 gtkmm 确实有一些高级的东西对于附加的 HID 事物,大概是因为它们对于与 GUI 交互非常重要。

答案2

我赞同 的回答goldilocks。但是,read可以使用inotify.

它的手册页是这里这里

创建者(开发者)有一个很好的解释和例子inotify 这里

相关内容