异步通知fasync的工作流程

    xiaoxiao2021-03-25  81

    异步通知fasync与系统调用signal和sigaction函数配合使用 signal函数提供一个信号与信号处理函数的对应方式,每接收到这个信号就会调用相应的处理函数。 fasync则提供驱动程序与进程的联系。

    应用层工作

    signal(SIGIO, sig_handler); 调用signal函数,让指定的信号SIGIO与处理函数sig_handler对应。

    fcntl(fd, F_SET_OWNER, getpid()); 指定一个进程作为文件的“属主(filp->owner)”,这样内核才知道信号要发给哪个进程。

    f_flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, f_flags | FASYNC); 在设备文件中添加FASYNC标志,驱动中就会调用将要实现的test_fasync函数。


    内核工作

    把一个结构体struct fasync_struct添加到内核的异步查找队列头中。 这个结构体用来存放对应设备文件的信息(如fd, filp)并交给内核来管理。 一但收到信号,内核就会在这个所谓的异步队列头找到相应的文件(fd),并在filp->owner中找到对应的进程PID,并且调用对应的sig_handler。

    驱动工作

    定义结构体fasync_struct。

    通过.fasync函数接口将结构体传给内核。

    当设备可用时,调用函数kill_fasync发送信号SIGIO给内核。

    当设备关闭时,将fasync_struct从异步队列中删除


    转载请注明原文地址: https://ju.6miu.com/read-16016.html

    最新回复(0)