首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用SYSFS将通知从内核发送到用户空间应用程序

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

Stack Overflow用户
提问于 2015-08-01 19:57:37
回答 2查看 2.7K关注 0票数 0

我在一个USB ACM驱动程序中工作,“我需要从内核空间向用户空间应用程序发送通知,以便调用回调函数”。我不太了解在代码中使用内核到用户界面。在这种情况下,sysfs能提供多大的帮助。请发送一些示例代码来使用sysfs,这样我就可以在我的代码中获得一个实现的想法。我到处都找不到它。此外,请告诉任何其他简单的方式实现内核到用户空间的通知。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-08-05 04:01:59

我的建议是创建一个到用户空间可以访问的内核驱动程序的sysfs接口。如果使用正确的属性创建,则可以像从用户空间读取文件一样读取每个sysfs属性。然后,您可以在用户空间中使用poll函数来轮询该文件上的操作。要从内核空间触发此操作,您可以在您的属性上使用sysfs_notify函数,它将唤醒您的用户空间代码。下面是我会怎么做

内核1.创建Kobject或将属性附加到以前的kobject 2.当您想向用户空间发出信号时,在kobject和属性上调用sysfs_notify

用户空间

从该线程中创建一个新线程,该线程将在等待sysfs_notify

  • Open
  1. 属性时阻塞
  2. 轮询该属性,一旦从内核调用sysfs_notify,它将解除阻塞轮询
  3. 调用您的事件处理函数
票数 1
EN

Stack Overflow用户

发布于 2018-10-14 23:25:25

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

用户空间

代码语言:javascript
运行
复制
#include <sys/eventfd.h>

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

内核空间

代码语言:javascript
运行
复制
#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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31761579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档