异步通知:一旦设备就绪,则主动通知应用程序,应用程序不需要查询设备状态,称为“信号驱动的异步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信息.