fasync简介

 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.  处理方式
    忽略:接收到信号后不做任何反应。
    捕获:用自定义的信号处理函数来执行特定的动作。
    默认:接收到信号后按系统默认的行为处理该信号。
            这是多数应用采取的处理方式。

参考:

fasync_百度百科
    信号_兰宝的专栏-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xw-何妨吟啸且徐行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值