阻塞与非阻塞初认识

阻塞与非阻塞

阻塞与非阻塞概念

阻塞:等待某件事情发生。如前面举例说明,使用read函数获取底层硬件数据,如果没有数据,会让任务休眠等待。

在使用poll方式,如果传入的等待时间不为0,任务是需要休眠等待的,也是阻塞的。

如果poll方式,将传入的等待时间为0,也即是不等待。没有数据立马返回,这是非阻塞方式。

问题

App在与驱动文件中,能否既工作在阻塞模式,也可以工作在非阻塞模式。

可以,通过一下两种方式:

Open函数,传入相关参数。

非阻塞:open(“/dev/xxx”,O_RDWR|O_NONBLOCK)。表示非阻塞方式。

阻塞:open(“/dev/xxx”,O_RDWR)。阻塞方式,默认是阻塞方式。

fcntl设置(一般在open函数之后)

int flags = fcntl(fd,F_GETFL)

fcntl (fd, F_SETFL,flags|O_NONBlOCK);//非阻塞模式

fcntl(fd,F_SETFL,flags & ~O_NONBLOCK);//阻塞模式

上面对应的变量flags对应struct file结构体变量中f_flags变量。通过查询f_flags变量。确定访问方式是否为阻塞。

在驱动中,可以集成休眠唤醒,查询,阻塞与非阻塞方式。驱动只提供功能,不提供策略。策略在App中体现。

posted @ 2022-07-28 21:53  JwChu  阅读(235)  评论(0编辑  收藏  举报