一、poll(异步阻塞)
这种模式的I/O操作并不是阻塞在设备的读写操作本身,而是阻塞在同一组设备文件的描述符上,当其中的某些描述符上代表的设备对读写操作已经就绪时,阻塞状态将被解除,用户程序随后可以对这些描述符代表的设备进行读写操作。
具体到Linux的字符设备驱动程序上就是需要实现file_operations中的poll函数以支持I/O模式。相对于驱动程序用户空间除了原生态的poll调用外,还有select和epoll。
但是对于驱动来说,这些应用层调用最终到驱动程序里只由poll函数来实现。
/*
第一个参数表示要打开的设备文件(文件描述符)。
第二个参数由应用程序传递进来的,一般将此参数传递给 poll_wait 函数。
*/
__poll_t (*poll) (struct file *, struct poll_table_struct *);
设备驱动中的poll会在一个或多个等待队列中调用poll_wait函数,这里需要注意poll_wait 函数不会引起阻塞,只是把当前进程添加到指定的等待列表(poll_table)中,当请求数据准备好之后,会唤醒这些