Linux内核的异步通知
来源:互联网 发布:域名赎回期是多久 编辑:程序博客网 时间:2024/05/29 14:27
Linux内核的异步通知
异步通知类似于中断,主要用于实现驱动通过发送信号通知应用程序。
应用层:
void my_signal_fun(int signum)
{
..............................
}
int main(int argc, char **argv)
{
int fd;
int Oflags;
signal(SIGIO, my_signal_fun);
fd = open("/dev/xxx", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
return -1;
}
fcntl(fd, F_SETOWN, getpid()); // 告诉驱动要发信号给本应用程序。
Oflags = fcntl(fd, F_GETFL); // 获取flags
fcntl(fd, F_SETFL, Oflags | FASYNC); // 设置flags支持异步通知 ,最终调用到驱动的fasync函数进行初始化。
while (1);
return 0;
}
驱动层:
static struct fasync_struct *my_async;
static int drv_fasync (int fd, struct file *filp, int on)
{
return fasync_helper (fd, filp, on, &my_async);
}
{
return fasync_helper (fd, filp, on, &my_async);
}
static struct file_operations drv_fops = {
.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
.fasync = drv_fasync,
};
.owner = THIS_MODULE, /* 这是一个宏,推向编译模块时自动创建的__this_module变量 */
.fasync = drv_fasync,
};
static int drv_init(void)
{
{
register_chrdev(major , "drv", &drv_fops);
}
static void drv_exit(void)
{
unregister_chrdev(major, "drv");
{
unregister_chrdev(major, "drv");
}
kill_fasync (&my_async, SIGIO, POLL_IN); //向应用程序发送SIGIO信号
module_init(drv_init);
module_exit(drv_exit);
MODULE_LICENSE("GPL");
module_exit(drv_exit);
MODULE_LICENSE("GPL");
- Linux内核的异步通知
- Linux内核异步通知
- 内核异步通知的例子
- Linux内核开发之异步通知与异步I/O_fcntl
- Linux内核中断引入用户空间(异步通知机制)
- linux内核中异步通知机制--信号处理机制
- Linux内核中断引入用户空间(异步通知机制)
- Linux内核中断引入用户空间(异步通知机制)
- Linux 异步通知I/O的原理
- linux下异步通知fasync的理解
- Linux的fasync驱动异步通知详解
- Linux的异步通知字符设备驱动
- linux驱动的异步同步通知机制
- Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
- Linux异步通知fasync
- Linux异步通知fasync
- Linux异步通知编程
- linux 异步通知fasync
- 2013.10.07
- POJ 2096 Collecting Bugs
- Ubuntu中安装Eclipse Java EE的方法
- 8255实现秒表
- 计算机会议级别
- Linux内核的异步通知
- 二级指针
- twitter 因api版本更新造成的 unknown error
- 我的samba配置
- STL内存分配器
- So cute are you python 1
- 6410的存储空间分配
- Linux 系统调用
- HTTP协议详解(真的很经典)