如何使用SYSFS从内核向用户空间应用程序发送通知

时间:2015-08-01 11:57:37

标签: linux-kernel usb linux-device-driver sample userspace

我正在使用USB ACM驱动程序,“我需要从内核空间向用户空间应用程序发送通知以调用回调函数”。我不太了解在代码中使用内核到用户界面。 sysfs如何帮助这种情况。请发送一些示例代码以使用sysfs,这样我就可以在我的代码中实现。我无处可寻。另外请告诉任何另一种简单的方法来实现内核到用户空间通知。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我的建议是为用户空间可以访问的内核驱动程序创建一个sysfs接口。如果使用正确的属性创建的每个sysfs属性都可以像用户空间中的文件一样读取。然后,您可以使用用户空间中的轮询功能来轮询该文件上的操作。要从内核空间触发此操作,可以在属性上使用sysfs_notify函数,这将导致用户空间代码被唤醒。我就是这样做的

内核  1.创建Kobject或将属性附加到先前的kobject  2.当您想要在kobject和属性

上发信号通知用户空间时调用sysfs_notify

用户空间

  1. 创建一个在等待sysfs_notify时阻塞的新线程
  2. 从此主题
  3. 打开sysfs属性
  4. 轮询该属性,一旦调用内核的sysfs_notify,它将解除阻止您的民意调查
  5. 调用您的事件处理函数

答案 1 :(得分:0)

另一种替代方法是使用eventfd。您创建eventfd,将整数文件描述符传递到内核空间(例如通过sysfs或ioctl),然后将从用户空间获得的文件描述符转换为内核空间中的eventfd_ctx。就是这样-您有了通知通道。

用户空间

#include <sys/eventfd.h>

int efd = eventfd(0, 0);
// pass 'efd' to kernel space

内核空间

#include <linux/eventfd.h>

// Set up
int efd = /* get from user space - sysfs/ioctl/write/... */;
struct eventfd_ctx* efd_ctx = eventfd_ctx_fdget(efd);

// Signal user space
eventfd_signal(efd_ctx, 1);

// Tear down
eventfd_ctx_put(efd_ctx);