Articles of 轮询

非阻塞获取字符

平台:Linux 3.2.0 x86(Debian 7) 编译器:GCC 4.7.2(Debian 4.7.2-5) 我正在写一个函数,如果一个字符已经存在于标准input中,它将从标准input读取单个字符。 如果标准input为空,则该函数假设不执行任何操作并返回-1。 我googled非阻塞input,并被指向poll()或select() 。 首先,我尝试使用select(),但我无法得到它的工作,所以我尝试了poll(),并得出了相同的结论。 我不确定这些函数做了什么,但是从我所了解的poll()的文档来看,如果我这样称呼: struct pollfd pollfds; pollfds = STDIN_FILENO; pollfds.events = POLLIN; poll(pollfds, 1, 0); 如果(pollfds.revents&POLLIN)将为真,如果“高优先级数据以外的数据可以不被阻塞地读取”。 但是poll()总是在我的testing情况下超时。 我如何testingfunction可能是问题,但我想要的function正是我所testing的。 这里是目前的function和testing情况。 #include <poll.h> #include <stdio.h> #include <unistd.h> int ngetc(char *c) { struct pollfd pollfds; pollfds.fd = STDIN_FILENO; pollfds.events = POLLIN; poll(&pollfds, 1, 0); if(pollfds.revents & POLLIN) { […]

为什么不调用“轮询”在sysfs设备属性文件上正确的阻塞?

我有一个简单的sysfs设备属性 ,它显示在我的sysfs目录下,并且在read调用时返回一个kernelspacevariables的值。 我想调用这个属性的poll ,以允许我的用户空间线程阻塞,直到属性显示的值改变。 我的问题是, poll似乎没有阻止我的属性 – 它不断地返回POLLPRI即使该属性显示的值不变。 实际上,我在内核模块中根本没有调用sysfs_notify ,但用户空间调用poll仍然没有阻塞。 也许我应该检查POLLPRI之外的返回值 – 但是根据 Linux内核的文档 , sysfs_poll应该返回POLLERR|POLLPRI : /* … When the content changes (assuming the * manager for the kobject supports notification), poll will * return POLLERR|POLLPRI … */ 有什么我忘记做poll吗? 设备属性位于: / sys / class / vilhelm / foo / blah 。 我加载一个名为foo的内核模块,它注册一个设备,并创build一个类和这个设备属性。 名为bar的用户空间应用程序产生一个调用设备属性poll的线程,检查POLLPRI 。 […]

使用Linux sysfs_notify调用

我试图在内核驱动程序和用户空间程序之间进行asynchronous通信(我知道这里有很多问题需要类似的信息,但是我找不到任何与sysfs_notify有关的问题)。 我在这里离开Vilhelm的编辑,但是将源代码添加到使用sysfs的简单驱动程序和用户空间程序来轮询它。 司机工作正常(我从网上获得了大部分,它是缺less信用,但我回去添加他们时找不到他们)。 不幸的是,投票程序不起作用。 它总是立即返回成功。 有趣的是,如果我在调查之前没有执行两次读取,则revents成员将设置为POLLERR | POLLIN而不是像在程序输出中看到的POLLIN。 节目输出: root @ ubuntu:/ home / wmulcahy / demo#./readhello 触发 属性文件值:74(t)[0] revents [0]:00000001 revents [1]:00000001 这里是驱动程序:hello.c(你可以看到我从哪里开始…) #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/slab.h> struct my_attr { struct attribute attr; int value; }; static struct my_attr notify = { .attr.name="notify", .attr.mode = 0644, .value = […]