首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在实时Linux中进行进程间的通信?

如何在实时Linux中进行进程间的通信?
EN

Stack Overflow用户
提问于 2015-04-13 23:30:56
回答 1查看 1.4K关注 0票数 4

关于如何通过FSMLabs为realtime编写实时代码有很多例子,但是这个发行版在很多年前就已经被放弃了。目前,针对普通内核的PREEMPT_RT修补程序正在积极开发,但官方Wiki上的代码示例很少。首先让我介绍一下我的问题。

我正在写一个包含两个程序的项目:

  1. 虚拟机的字节码-它必须作为实时应用程序-它有64 KB的I/O内存和64 KB的字节代码。
  2. 客户端程序-它将读写I/O内存,启动/暂停机器,加载新程序,设置参数等。它不必是实时的。

如何在这些进程之间进行通信以保持进程(1)的实时性,并避免页面错误或其他可能干扰实时应用程序的行为?

方法1.仅使用线程

有两个线程:

  • 具有最高优先级的虚拟机线程
  • 具有正常优先级的客户端线程与用户和机器通信,两个线程都可以按名称访问所有全局变量。我可以在每台机器循环之后为输入/输出数据创建额外的缓冲区。但是,如果客户端线程导致应用程序崩溃,机器线程也将终止。实现远程访问也更加困难。

方法2.共享内存

在旧的FSMLabs中,建议在进程之间使用共享的全局内存。现代PREEMPT_RT的Wiki页面建议使用mmap()进行进程数据共享,但在同一篇文章中,由于页面错误,它不鼓励mmap()。

方法3.命名管道

这是一种更灵活的进程间通信方式。不过,我对Linux编程还不熟悉。我们希望在机器和客户端之间共享内存,但它也应该提供一种方法来加载新程序(文件路径或程序代码)、停止/启动机器等。旧的FSMLabs RT实现了它自己的FIFO队列(命名管道)。现代PREEMPT_RT没有。使用名称管道会破坏实时行为吗?如何做好呢?是使用O_NONBLOCK标志读取数据,还是创建另一个线程,用于从管道读取/写入数据?

你知道在一个进程必须是实时的进程之间进行通信的其他方式吗?也许我只需要线。但是,考虑一个更多的客户端连接到虚拟机进程的场景。

EN

回答 1

Stack Overflow用户

发布于 2017-11-24 09:12:26

为了在同一主机操作系统上执行的进程之间交换数据,还可以使用UNIX域套接字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29616738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档