当内核空间发生事件时,如何通知用户空间应用程序?
当数据到达某个 GPIO 时,硬件会产生一个中断。
此数据被复制到内核缓冲区。此时,我希望驱动程序通知应用程序它可以调用 read 函数将数据从内核缓冲区复制到用户空间缓冲区。
我想到了使用epoll方法,但是epoll表示设备是否准备好被读取。我想要的是,epoll 指示何时内核缓冲区已满。
还有,有没有办法修改驱动程序中 poll_wait() 函数的行为?
最佳答案
(已在聊天 session 中回复,但似乎这应该在答案中,所以将其更详细地放在这里。)
poll_wait 所做的是将您的驱动程序添加到用户空间程序正在等待的文件描述符列表中。模式是:
IOW,poll_wait 本身不会休眠(或阻塞);它只是将您的设备添加到稍后可能会唤醒进程的程序列表中。 sleep 是在核心内核中完成的(例如,在 select 系统调用中)。这样,用户程序可以使用 select 一次在任意数量的设备上等待。
如果您的用户空间程序在等待期间确实没有任何其他事情可做,那么您可以简单地让用户程序调用读取,并让您的驱动程序设置其等待队列并调用 wait_event_interruptible(或其中之一其他 wait_event_* 变体)。这将阻止进程,直到您的中断处理程序调用 wake_up;那时你从内核缓冲区复制到用户缓冲区。
或者您可以同时支持这两种方法。通常,如果您支持 select 方法,您还会在读取函数中检查 O_NONBLOCK 文件标志,以便用户代码可以选择不在读取中阻塞。
是的,ISR 可以调用 wake_up。这是设备 I/O 的常见模式:在“进程上下文”中等待/阻塞,在“中断上下文”中唤醒,然后在返回进程上下文后完成 I/O。
顺便说一句,从驱动程序的角度来看,使用 select、poll 或 epoll 通常是相同的。从用户的角度来看,使用 select 或 poll 更容易一些。这是一个“一次性”交易:“这里有一组文件描述符;阻塞直到其中一个准备好读取(或写入等)或直到超时”。
而对于 epoll,您首先创建一个 epoll 描述符,然后单独添加 I/O 文件描述符。但随后“等待”调用仅指定单个 epoll 描述符。因此,如果您有大量文件描述符要等待,则不必在每个系统调用中指定所有这些文件描述符,从而降低每次 epoll 调用的系统调用开销。
关于linux - 从内核空间到用户空间的事件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24444670/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的