应用层
extern __sighandler_t signal (int __sig, __sighandler_t __handler)
设置某个信号的中断函数
extern int fcntl (fd,F_SETOWN,getpid());
设置设备文件的拥有者为本进程,这样一来才能收到设备驱动发出的SIGIO信号。
flag = fcntl(fd,F_GETFL);
获取旧的文件标志
fcntl(fd,F_SETFL,flag|FASYNC);
使设备文件支持异步通知,即设置FASYNC标志。此函数会触发驱动程序中的fasync函数
驱动层
实现file_operation中的.fasync
static int fasync (int fd, struct file *file, int on)
{
struct chr_dev *dev = file->private_data;
printk("asd\r\n");
return fasync_helper(fd,file,on,&dev->fasync_queue);//插入到异步通知链
}
kill_fasync(&dev->fasync_queue,SIGIO,POLL_IN);
向应用层发出SIGIO信号