当前位置: 首页 > article >正文

【Linux】kernel与应用消息队列的一种设计

Linux进程间通讯的方式有很多种,这里介绍一种通过消息队列的方式来实现kernel与APP之间的消息收发实现方式,这种方式特别适用于,kernel中发送消息,应用层收取消息。

消息队列设备驱动

该方法的设计思路即是创建一个消息队列的设备,应用层通过该设备读取消息队列(通过一个线程);

static const struct file_operations com_kumsgq_fileops = {
    .read        = com_kumsgq_read,
    .poll        = com_kumsgq_poll,
    .release    = com_kumsgq_release,
};

int com_kumsgq_newfd(struct kumsgq *msgq, int flags)
{
	int ret, fd;
	struct kumsgfile *msgfile;

	if (((flags & O_ACCMODE) != O_RDONLY)
			|| (flags & ~(O_ACCMODE | O_NONBLOCK | O_CLOEXEC)))
		return -EINVAL;

	msgfile = kzalloc(sizeof(struct kumsgfile), GFP_KERNEL);
	if (!msgfile)
		return -ENOMEM;

	msgfile->msgq = msgq;
	INIT_LIST_HEAD(&msgfile->messages);
	spin_lock_init(&msgfile->messages_lock);

	ret = get_unused_fd_flags(O_RDWR | (flags & O_CLOEXEC));
	if (ret < 0)
		goto err_free_msgfile;
	fd = ret;

	msgfile->file = anon_inode_getfile("[com_kumsgq]", &com_kumsgq_fileops,
					msgfile, flags);
	if (IS_ERR(msgfile->file)) {
		ret = PTR_ERR(msgfile->file);
		goto err_put_fd;
	}

	fd_install(fd, msgfile->file);

	mutex_lock(&msgq->files_lock);

	list_add(&msgfile->list, &msgq->kumsgfiles);

	com_kumsgq_get(msgq);

	mutex_unlock(&msgq->files_lock);

	return fd;

err_put_fd:
	put_unused_fd(fd);
err_free_msgfile:
	kfree(msgfile);
	return ret;
}

驱动层插入消息到消息队列中,应用层创建一个线程从消息队列设备中读取消息。
 


http://www.kler.cn/a/133241.html

相关文章:

  • 【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
  • Ubuntu 18 EDK2 环境编译
  • 【计算机网络】TCP协议特点3
  • 【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读
  • 华为云前台展示公网访问需要购买EIP,EIP流量走向
  • hive 统计各项目下排名前5的问题种类
  • Redis篇---第七篇
  • DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)
  • 机器人走迷宫问题
  • ubuntu18.04中代码迁移到20.04报错
  • 【数据结构】栈与队列的实现
  • webpack的安全保障是怎么做的?
  • Windows使用ssh远程连接(虚拟机)Linux(Ubuntu)的方法
  • 导航守卫有哪三种?
  • [msg_msg] corCTF2021 -- fire_of_salvation
  • vue中watch监听事件与计算属性的区别
  • Linux 环境删除Conda
  • 【网络奇遇记】我和因特网的初相遇2 —— 三种交换方式
  • DPAFNet:一种用于多模式脑肿瘤分割的残差双路径注意力融合卷积神经网络
  • 表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
  • 如何检查 Docker 和 Kubernetes 是否可以访问外部网络,特别是用于拉取镜像的仓库?
  • 【软件安装】Centos系统中安装docker容器(华为云HECS云耀服务器)
  • Python3.7+PyQt5 pyuic5将.ui文件转换为.py文件、Python读取配置文件、生成日志
  • uni-app小程序开发使用uView,u-model传入富文本内容过长,真机上无法滚动
  • 【2023年csp-j第二轮】第一题解析
  • 【算法挨揍日记】day29——139. 单词拆分、467. 环绕字符串中唯一的子字符串