查询方式:
APP调用open函数时,传入“O_NONBLOCK”表示非阻塞,就可以以非阻塞方式,也就是查询方式用read函数去读取,如果没有数据的话,就会立刻返回一个错误。
如果我们打开这个文件时没有传入“NONBLOCK”参数,APP去调用read函数,如果驱动程序中有数据,那么APP的read函数会返回数据,否则APP就会在内核态休眠,当有数据时,驱动会把APP唤醒,read函数恢复执行并返回数据给APP.
POLL/SELECT 方式(API是不一样是那个的,其他都是一样的)
POLL函数:
需要包含的头文件和POLL函数的使用方法
struct *fds 是一个指针数组,指针数组有多少项由nfds决定,POLL函数可以检测多个函数,最后一个参数是超时时间
struct pollfd 结构体
fd是指要检测的文件
events 表示要求的,它期望的它期望的事件
比如说,我们想去读取输入事件时,想到读到数据,那么我们期望的是有数据可供应用程序来读,这时候就可以去设置这个event等于POLLIN,但有时候应用程序是想把数据发给硬件,发给驱动程序,这个时候应该把event设置为POLLOUT,表明它期望这个驱动程序有空间给应用程序来写数据,当这个POLL函数返回时,这个驱动程序会设置returned event 的值,把这个returned event设置成POLLIN ,POLLOUT 或者其他值,当这个POLL函数正常返回时,你需要去判断里面的每一个结构体,来看看returned event是不是你期望的event,如果是你期望的event,就表明有数据或者有空间。
那么这个POLL函数的返回值是怎么样的呢?
一个是正整数,表明有多少个文件就绪了(也就是有多少个文件有数据可读,或者有空间可写),如果返回一个零的话,就表明是超时,如果是-1的话,就表明发生了某些错误。
异步通信
异步通信时,驱动程序会给应用程序发信号SIGIO,应用程序把自己的进程号事先告诉驱动程序,这样驱动程序才能够应用程序发信号,应用程序接收到信号后,执行信号处理函数,信号处理函数和信号怎么挂钩,APP事先注册信号处理函数
APP怎么注册信号处理函数