一、阻塞I/O
1、首先定义初始化队列头
1)、静态定义初始化法:DECLARE_WAIT_QUEUE_HEAD(name) 这里定义了一个队列头并且初始化名为name
2)、动态定义+初始化:定义一个队列头wait_queue_head_t my_queue
初始化队列头 init_waitqueue_head(&my_queue);
2、将某个进程加入到等待队列中 进行休眠
如:wait_event(name,condtion) 将当前wait_event(name,condtion)所处于的进程加入到以name为队列头的等待队列中
3、当上一个(也就是2中提到的wait_event()所处于的进程)进程进入睡眠时,下一个进 程将进行操作。在此进程中要进行两步操作:
1)、将wait_event(name,condtion)中的condition设置为真,这样才能对2中提到的进程进行唤醒,
2)、wake_up(&name) 唤醒上一个进程
二、非阻塞I/O
1、以非阻塞的方式打开一个文件,返回文件描述符fd
2、FD_ZERO宏清除文件描述符集
FD_SET宏向文件描述符集添加获得的文件描述符fd
3、使用select()系统调用查询是否可对设备进行无阻塞的访问
4、由于应用层调用系统调用select()函数,所以将引发设备驱动中的Poll()函数被执行
5、Poll()函数完成两步工作
1)、将可能引起设备文件状态变化的等待队列调用poll_wait(),将对应的等待队列添加到poll_table中
2)、返回表示能否对设备进行无阻塞读写访问的位掩码
6、驱动层返回位掩码,应用层通过FD_ISSET判断文件描述符为fd的文件在文件描述符集中是否置位,若置位表示可以操作