c - 如何在实时 Linux 中进行进程间通信?

标签 c linux process real-time preempt-rt

FSMLabs 提供了很多如何为 RT-Linux 编写实时代码的示例,但该发行版已被废弃多年。目前针对 vanilla 内核的 PREEMPT_RT 补丁正在积极开发中,但官方 Wiki 上的代码示例很少。首先让我介绍一下我的问题。

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

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

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

方法 1. 仅使用线程

有2个线程:

  • 具有最高优先级的虚拟机线程

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

方法二、共享内存

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

方法 3. 命名管道

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

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

最佳答案

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

关于c - 如何在实时 Linux 中进行进程间通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616738/

相关文章:

当我在 C 中使用 fread 时无法读取二进制文件

c - 防止对 c 中的一个操作进行优化

linux - 批量重命名相似名称的文件

c - C中从父进程到子进程连续写入

c# - 在 C# 中访问 Process.MainModule.FileName 时如何避免 Win32 异常?

c - 特殊字符在 Linux 终端中显示不正确

c - 是否可以从内存泄漏中获取数据?

linux - 创建和扩展 centos 6-i386 Docker 基础镜像时出现 "cp: Command not found"

linux - DISPLAY 环境变量的语法是什么?

c++ - 如何在 C++ 任务管理器上更改进程的名称?