fasync是指应用于系统调用signal和sigaction函数的中断机制。
简单的说,signal函数就是让一个信号与一个函数对应,每当接收到这个信号就会调用相应的函数。
那么什么是异步通知?异步通知类似于中断的机制,当设备可写时,设备驱动函数发送一个信号给内核,告知内核有数据可读,在条件不满足之前,并不会造成阻塞。而不像之前学的阻塞型IO和poll,它们是调用函数进去检查,条件不满足时还会造成阻塞。
使用方式:
其实在应用层启用异步通知只三个步骤:
1)signal(SIGIO, sig_handler);
调用signal函数,让指定的信号SIGIO与处理函数sig_handler对应。
2)fcntl(fd, F_SET_OWNER, getpid());
指定一个进程作为文件的“属主(filp->owner)”,这样内核才知道信号要发给哪个进程。
3)f_flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, f_flags | FASYNC);
在设备文件中添加FASYNC标志,驱动中就会调用将要实现的test_fasync函数。
三个步骤执行后,一旦有信号产生,相应的进程就会收到。
linux ——信号简介
1. 定义
简而言之,信号是一种软件中断,提供了一种处理异步的方法,信号发生是随机的。例如键盘输入中断按键(^C),它的发生在程序执行过程中是不可预测的。
硬件异常也能产生信号,例如被零除、无效内存引用(test里产生的就是这种错误)等。这些条件通常先由内核硬件检测到,然后通知内核。内核将决定产生什么样的信号。
同一个信号的额外发生通常不会被排队。如果信号在被阻塞时发生了5次,当我们反阻塞这个信号时,这个信号的信号处理函数通常只被调用一次。
同一时刻只能处理一个信号,在信号处理函数发信号给自己时,该信号会被pending。
信号的数值越小,则优先级越高。当进程收到多个待处理信号时,总是先处理优先级别高的信号。
信号处理函数的栈可以使用被中断的也可以使用独立的,具体可以通过系统调用设置。
2. 处理方式
忽略:接收到信号后不做任何反应。
捕获:用自定义的信号处理函数来执行特定的动作。
默认:接收到信号后按系统默认的行为处理该信号。
这是多数应用采取的处理方式。