驱动阻塞模型
等待队列:
在linux驱动程序设计中,可以实现等待队列来实现进程的阻塞。等待队列可以看做保存进程的容器,在阻塞进程时,将进程放入等待队列,当唤醒进程时,从等待队列中取出进程。
主要方法如下:
但是我写的等待队列阻塞程序总有一些问题,就是不能成功唤醒等待程序,如下:
正确版本:
错误版本:
查看了内核源码,原来是这样,如果传进去一个常数0,wait_event就永远都不会跳出去了。
Select和poll:
上图是系统调用和驱动的对应关系。
使用非阻塞 I/O 的应用程序常常使用 poll, select, 每个允许一个进程来决定它是否可读或者写一个或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来读或写. 因此, 它们常常用在必须使用多输入输出流的应用程序, 而不必粘连在它们任何一个上.
Select原型如下:
其参数解释如下:
Select返回值说明如下:
Select对集合的操作是通过4个宏来完成的:
下面说一下标准的select调用过程:
Select和poll方法需要配合使用,poll方法的编写规则较为固定,如下:
上述几个主要的位掩码功能为:
Poll方法的主要功能:
注意,等待并不是在poll中执行的。
自动创建设备文件:
注意:需要开启mdev。
小知识 open和fopen: