异步通知与异步I/O

异步通知:一旦设备就绪,则主动通知应用程序,应用程序不需要查询设备状态,称为“信号驱动的异步I/O”.
Linux信号用于进程间通信(IPC)。linux使用信号来实现异步通知。出了SIGSTOP和SIGKILL两个信号外,进程可以忽略或捕获其他的全部信号。
信号的接收(signal):
void (*signal ( int sigum ,void (*handler)(int)) )(int);//sigum信号的值; hander针对sigum的处理函数
signal调用成功,则返回最后一次为信号sigum绑定的处理函数handler值,失败则返回SIG_ERR。

信号的释放:
1.   struct   fasync_struct,异步操作的文件指针结构。 

struct   fasync_struct   { 
int magic; 
int fa_fd; 
struct fasync_struct *fa_next;   /*   singly   linked   list   */ 
struct file   *fa_file; 
}; 

2.kill_fasync(),   释放异步文件指针。 
extern   void   kill_fasync(struct   fasync_struct   **,   int,   int);可中断 
extern   void   __kill_fasync(struct   fasync_struct   *,   int,   int);不可中断 

3.struct   fown_struct   异步操作的进程结构 

struct   fown_struct   { 
rwlock_t   lock;                     /*   protects   pid,   uid,   euid   fields   */ 
int   pid; /*   pid   or   -pgrp   where   SIGIO   should   be   sent   */ 
uid_t   uid,   euid; /*   uid/euid   of   process   setting   the   owner   */ 
void   *security; 
int   signum; /*   posix.1b   rt   signal   to   be   delivered   on   IO   */ 
};

1) 当文件操作表定义了fasync操作时, 用户可以使用fcntl(F_SETFL)将文件切换到异步操作模式,
当文件可读时,
内核产生特定的信号并通过siginfo结构将其文件描述符和状态信息传递给用户的信号处理器.

2) tty_fasync操作创建包含文件描述符和文件指针的异步操作结构(fasync_struct),
把它链入tty结构的异步文件操作表(tty->fasync). 当终端的接收缓冲区满足读取条件时,
内核生成POLL_IN消息通知文件所在的进程或者进程组.

3) 内核生成的异步信号由打开文件的f_owner结构描述,
用户可使用fcntl(F_SETSIG)来设置信号量, 用fcntl(F_SETOWN)来设置信号所要发送的进程.
在缺省情况下, 内核向文件所在的进程或进程组发送简单的SIGIO信号.
当用户指定了确定的异步信号时,
用户信号处理器必须指定SA_SIGINFO属性才能收到其siginfo信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值