全志 A64 Linux内核等待队列poll ---阻塞与非阻塞

简介: 开发平台 芯灵思Sinlinx A64内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm开发板交流群 641395230 阻塞:阻塞调用是指调用结果返回之前,当前进程程会被挂起(休眠)。

开发平台 芯灵思Sinlinx A64
内存: 1GB 存储: 4GB

阻塞:阻塞调用是指调用结果返回之前,当前进程程会被挂起(休眠)。函数只有在得到结果之后才会返回。默认情况下,文件都是以这种方式打开。
非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前进程程,而会立刻返回。应用程序可选择以阻塞或非阻塞方式打开设备文件,然后设备进行读写操作,如果驱动的读写函数支持阻塞和非阻塞功能,这两种打开方式才会有区别。

阻塞示例 :fd = open("/xxx/word", O_RDONLY ); // 默认阻塞方式打开

    如果此时没有数据可以读取,则执行休眠
     如果有数据可以读取,则马上读取数据,不休眠,读取数据后马上返回。

非阻塞示例 :fd = open("/xxx/word", O_RDONLY | O_NONBLOCK ); //非阻塞方式打开

    如果此时已经有数据可以读取,则读取数据再返回。
    如果没有数据可以读,也马上返回,但是返回一个错误码。

1)驱动中如何得到用户空间应用程序打开的方式?

    open一个设备,内核会创建一个file结构,并且把打开方式的数值存放到file结构成员f_flags成员中,驱动程序的read,write 接口可以使用参数file指针取得文件打开方式。file结构中有一个成员是f_flags ,创建时候,内核会把open 函数的最后一个参数 flag 数值保存在 f_flags 变量中。
static ssize_t xxx_read(struct file *pfile, char user *buf, size_t count, loff_t *poff)
{
    ……
    //判断当前是否有按键动作
    if(没有按键动作)
    {
        //判断 pfile->f_flags 成员是否设置 O_NONBLOCK  
        if(pfile->f_flags & O_NONBLOCK) //表示用户空间使用非阻塞打开
        {
                return - EAGAIN; //返回一个错误码,告诉用户空间你可以再尝试读取
        }
        //阻塞方式打开,没有数据就休眠,不马上返回else
        {
                //休眠,等待有按键动作唤醒进程。
        }
    }
}

2)如何知道是否有按键动作?

    如果按键按键或松开时刻,会产生一个中断,所以,在中断程序设置一个标志即可。
    定义一个全局变量,初始值为 0,表示没有按键动作发生,在中断程序中设置这个变量值为 1,表示发生按键动作。

3)如何让进程进入休眠状态?

    最简单,最直接的休眠方式: msleep 函数
    这个函数:一旦调用,则调用进程会休眠指定长的时间,时间一到内核会唤醒这个进程.
    //休眠,等待有按键动作唤醒进程。
    while(press == 0)
                 msleep(5); // 休眠5ms 
相关文章
|
20天前
|
Linux API 调度
技术笔记:Linux内核跟踪和性能分析
技术笔记:Linux内核跟踪和性能分析
|
6天前
|
Linux
查看linux内核版本
在Linux中查看内核版本可使用`uname -r`、`cat /proc/version`、`lsb_release -a`、`cat /etc/*release`、`dmesg | grep Linux`、`hostnamectl`、`kernrelease`(部分系统)、`rpm -q kernel`(RPM系统)或`dpkg -l linux-image-*`(Debian系)。
9 2
|
12天前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
|
28天前
|
Linux
查看linux内核版本
在Linux中查看内核版本可使用`uname -r`、`cat /proc/version`、`lsb_release -a`(若安装LSB)、`/etc/*release`或`/etc/*version`文件、`dmesg | grep Linux`、`cat /sys/class/dmi/id/product_name`、`hostnamectl`、`kernrelease`(如果支持)、`rpm -q kernel`(RPM系统)和`dpkg -l linux-image-*`(Debian系统)。
32 4
|
29天前
|
安全 Linux 数据处理
探索Linux的kmod命令:管理内核模块的利器
`kmod`是Linux下管理内核模块的工具,用于加载、卸载和管理模块及其依赖。使用`kmod load`来加载模块,`kmod remove`卸载模块,`kmod list`查看已加载模块,`kmod alias`显示模块别名。注意需有root权限,且要考虑依赖关系和版本兼容性。最佳实践包括备份、查阅文档和使用额外的管理工具。
|
12天前
|
Linux 调度
部署03---Linux操作系统的诞生,Linux操作系统由系统的内核和系统的操作系统所组成
部署03---Linux操作系统的诞生,Linux操作系统由系统的内核和系统的操作系统所组成
|
Linux
Linux的poll与epoll实现(1)---poll
     这是自己第一次写Linux源码的分析,看的多了,写还是第一次,呵呵。      废话不多说,相信看这篇文章的都用过poll和epoll,先来看poll系统调用的源码。 asmlinkage long sys_poll(struct pollfd __user ...
832 0
|
Linux 存储
Linux的poll与epoll实现(2)---epoll_create
    昨晚分析了poll,通过代码的阅读可以发现,poll操作有很多可以优化的地方。epoll是eventpoll的简称,他的效率是非常高的,我们今天来看看他的实现。他的实现在FS/Eventpoll.c,代码有1500多行,呵呵,怕了吧。
802 0
|
Linux 容器 存储
Linux的poll与epoll实现(3)---epoll_ctl
大家都知道,这个epoll_ctl系统调用是epoll高效之所在,因为把文件描述符集合的传递与轮询分离,而对目标文件描述符集合的操作就在这个epoll_ctl里面完成。我们先来关注一下数据结构: 第一个是昨天提到的eventpoll,这里就不说了。
954 0
|
3天前
|
存储 安全 Linux
Linux命令sync详解
`sync`命令在Linux中用于将内存缓冲区的数据强制写入磁盘,保证数据持久性和一致性。它在关机、重启或重要文件操作前后使用,以防数据丢失。工作原理是强制将内存中的数据同步到磁盘,特点是阻塞式执行且通常无需参数。常见用法包括安全关机、数据备份和配置文件修改后确保更改生效。应注意,过度使用可能影响性能,应适时使用`fsck`检查文件系统一致性。