fasync( 在内核发生某个事情时向应用发信号, 应用需要把那个设备用 fcntl 改一下。) 分类: Linux 2012-04-10 09:35 739 人阅读评论(0) 收藏举报 struct buffer file semaphore kill user 分类: kernel 2009-12-19 18:20 735 人阅读评论(1) 收藏举报 fasync 的解释 fasync (fd , file , on) 当我们呼叫 fcntl() 系统呼叫, 并使用 F_SETFL 命令来设定档案的参数时, VFS 就会呼叫 fasync () 这个函式,而当读写档案的动作完成时,行程会收到 SIGIO 的讯息。=================================================================== ============== 首先,打开目标设备。第二,设置好目标设备的 SIGIO 信号处理程序。第三,需要通过 fcntl 系统调用,使当前进程变成文件的主人。(这样才能使文件中的信号发到当前进程) 第四,通过 ioctl 系统调用,将目标通道设置成异步操作模式。在驱动程序的 fops 中,有一个函数 int (*fasync)(int fd, struct file * file, int on); 在系统调用 sys_ioctl 的时候,会调用上面的 fasync 函数。例如,鼠标器的 int fasync_aux(int fd, struct file * filp, int on) { int retval; retval = fasync_helper(fd, filp, on, &queue->fasync); if (retval < 0) return retval; return 0; } 这里的 queue 类似于(struct mydev *)filp->private_data , fasync 则是里面的一个 fasyn c 队列。 fasync_helper 的作用是为当前进程创建一个 fasync_struct 数据结构,然后挂入目标设备的 fasync 队列。然后,在目标设备的常规驱动处理程序中,向该队列发送信号。例如,鼠标驱动器的 void handle_mouse_event(unsigned char scancode) (这类似于 usb 驱动中的 int urb ,一个回调函数) { ...... kill_fasync(&queue->fasync, SIGIO, POLL_IN); ...... } 即向每一个登记的进程发送 SIGIO 信号。本文来自 CSDN 博客,转载请标明出处: http://blog./walkingman321/archive/2008/03/09/ =================================================================== ============== 一个简单例子: #include <linux/> #include <linux/> #include <linux/> #include <linux/> #include <linux/> #include <linux/> #include <linux/> #include <asm/> #include <asm/> #include <asm-generic/> #define DEVICE_NAME "chardev" static int chardev_open(struct inode *inodp, struct file *filp); static ssize_t chardev_read(struct file *filp, char __user *buff, size_t count, loff_t *f_pos); static ssize_t chardev_write(struct file *filp, const char __user *buff, size_t count, loff_t *f_pos); static int chardev_fasync(int fd, struct file *filp, int mode); static int chardev_release(struct inode *inodp, struct file *filp); static stru
异步通知fasync 来自淘豆网m.daumloan.com转载请标明出处.