linux 驱动异步通知机制

来源:互联网 发布:mac里面照片怎么删除 编辑:程序博客网 时间:2024/06/06 03:27

参考文章:

linux驱动异步通知机制

应用程序:

1signal(SIGIO, sig_handler);

调用signal函数指定信号SIGIO去处理 sig_handler

2fcntl(fd, F_SET_OWNER, getpid());

指定当前进程,这样内核才知道将信号发给那个进程

3f_flags = fcntl(fd, F_GETFL);

fcntl(fd, F_SETFL, f_flags | FASYNC);

void sig_hanler(int signo)

{

     处理相关操作

}

最好利用 sigaction


struct sigaction aciton;

memset(actiton,0,sizeof(action));action.sa_handler = sig_handler;action.sa_flags = 0;sigaction(SIGIO,&action,NULL);

驱动:

struct my_dev{

    struct cdev cdev;

   struct fasync_struct *async_queue;

}

利用udev自动创建设备节点

int my_fasync (int fd, struct file *filp, int mode)

{

             struct  my_dev  *dev = filp->private_data;


         return fasync_helper(fd, filp, mode, &dev->async_queue);

}


当我们的设备可写时,

if (dev->async_queue){

 kill_fasync(&dev->async_queue, SIGIO, POLL_IN);

}

当关闭设备时,

 my_fasync(-1, filp, 0);

在struct file_operations  ={

     .fasync = my_fasync,

};


0 0