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信号。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值