Linux设备驱动中的异步操作

首先,打开目标设备。
第二,设置好目标设备的SIGIO信号处理程序。
第三,需要通过fcntl系统调用,使当前进程变成文件的主人。(这样才能使文件中的信号
发到当前进程)
第四,通过ioctl系统调用,将目标通道设置成异步操作模式。

在驱动程序的fops中,有一个函数
    int (*fasync)(int fd, struct file * file, int on);

在系统调用sys_ioctl的时候,会调用上面的fasync函数。

例如,鼠标器的
int fasync_aux(int fd, struct file * filp, int on)
{
    int retval;

    retval = fasync_helper(fd, filp, on, &queue->fasync);
    if (retval < 0)
        return retval;
    return 0;
}

这里的queue类似于(struct mydev *)filp->private_data,fasync则是里面的一个fasyn
c队列。
fasync_helper的作用是为当前进程创建一个fasync_struct数据结构,然后挂入目标设备
的fasync队列。

然后,在目标设备的常规驱动处理程序中,向该队列发送信号。

例如,鼠标驱动器的
void handle_mouse_event(unsigned char scancode)(这类似于usb驱动中的int urb,一
个回调函数)
{
    ......
    kill_fasync(&queue->fasync, SIGIO, POLL_IN);
    ......
}

即向每一个登记的进程发送SIGIO信号。
 

你可能感兴趣的:(Linux设备驱动中的异步操作)