标签:
在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。异步通知类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步I/O”。
SIGHUP 终止进程 终端线路挂断
SIGINT 终止进程 中断进程
SIGQUIT 建立CORE文件终止进程,并且生成core文件
SIGILL 建立CORE文件 非法指令
SIGTRAP 建立CORE文件 跟踪自陷
SIGBUS 建立CORE文件 总线错误
SIGSEGV 建立CORE文件 段非法错误
SIGFPE 建立CORE文件 浮点异常
SIGIOT 建立CORE文件 执行I/O自陷
SIGKILL 终止进程 杀死进程
SIGPIPE 终止进程 向一个没有读进程的管道写数据
SIGALARM 终止进程 计时器到时
SIGTERM 终止进程 软件终止信号
SIGSTOP 停止进程 非终端来的停止信号
SIGTSTP 停止进程 终端来的停止信号
SIGCONT 忽略信号 继续执行一个停止的进程
SIGURG 忽略信号 I/O紧急信号
SIGIO 忽略信号 描述符上可以进行I/O
SIGCHLD 忽略信号 当子进程停止或退出时通知父进程
SIGTTOU 停止进程 后台进程写终端
SIGTTIN 停止进程 后台进程读终端
SIGXGPU 终止进程 CPU时限超时
SIGXFSZ 终止进程 文件长度过长
SIGWINCH 忽略信号 窗口大小发生变化
SIGPROF 终止进程 统计分布图用计时器到时
SIGUSR1 终止进程 用户定义信号1
SIGUSR2 终止进程 用户定义信号2
SIGVTALRM 终止进程 虚拟计时器到时
int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact);
//启动信号机制
void sigterm_handler(int sigo)
{
char data[MAX_LEN];
int len;
len = read(STDIN_FILENO,&data,MAX_LEN);
data[len] = 0;
printf("Input available:%s\n",data);
exit(0);
}
int main(void)
{
int oflags;
//启动信号驱动机制
signal(SIGIO,sigterm_handler);
fcntl(STDIN_FILENO,F_SETOWN,getpid());
oflags = fcntl(STDIN_FILENO,F_GETFL);
fctcl(STDIN_FILENO,F_SETFL,oflags | FASYNC);
//建立一个死循环,防止程序结束
whlie(1);
return 0;
}
int fasync_helper(int fd,struct file *filp,int mode,struct fasync_struct **fa);
void kill_fasync(struct fasync_struct **fa,int sig,int band);
//异步通知的设备结构体模板
struct xxx_dev{
struct cdev cdev;
...
struct fasync_struct *async_queue;//异步结构体指针
};
static int xxx_fasync(int fd,struct file *filp, int mode)
{
struct xxx_dev *dev = filp->private_data;
return fasync_helper(fd, filp, mode, &dev->async_queue);
}
static ssize_t xxx_write(struct file *filp,const char __user *buf,size_t count,loff_t *ppos)
{
struct xxx_dev *dev = filp->private_data;
...
//产生异步读信息
if(dev->async_queue)
kill_fasync(&dev->async_queue,GIGIO,POLL_IN);
...
}
int xxx_release(struct inode *inode,struct file *filp)
{
//将文件从异步通知列表中删除
xxx_fasync(-1,filp,0);
...
return 0;
}
同步I/O:linux系统中最常用的输入输出(I/O)模型是同步I/O,在这个模型中,当请求发出后,应用程序就会阻塞,知道请求满足
异步I/O:I/O请求可能需要与其它进程产生交叠
Linux 系统中最常用的输入/输出(I/O)模型是同步 I/O
int aio_read( struct aiocb *aiocbp );
int aio_write( struct aiocb *aiocbp );
int aio_error( struct aiocb *aiocbp );
ssize_t aio_return( struct aiocb *aiocbp );
int aio_suspend( const struct aiocb *const cblist[], int n, const struct timespec *timeout );
int aio_cancel( int fd, struct aiocb *aiocbp );
int lio_listio( int mode, struct aiocb *list[], int nent, struct sigevent *sig );
io_setup( )
//Initializes an asynchronous context for the current process
io_submit( )
//Submits one or more asynchronous I/O operations
io_getevents( )
//Gets the completion status of some outstanding asynchronous I/O operations
io_cancel( )
//Cancels an outstanding I/O operation
io_destroy( )
//Removes an asynchronous context for the current process
通过is_sync_kiocb判断某kiocb是否为同步I/O请求
字符设备:必须明确应支持AIO(极少数是异步I/O操作)
ssize_t (*aio_read) (struct kiocb *iocb, char *buffer, size_t count, loff_t offset);
ssize_t (*aio_write) (struct kiocb *iocb, const char *buffer, size_t count, loff_t offset);
int (*aio_fsync) (struct kiocb *iocb, int datasync);
《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O
标签:
原文地址:http://blog.csdn.net/z1106609486/article/details/51461058