阻塞与非阻塞初认识
阻塞与非阻塞
阻塞与非阻塞概念
阻塞:等待某件事情发生。如前面举例说明,使用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中体现。
困于心 衡于虑 而后作