C 在实时Linux中如何在进程之间通信?

C 在实时Linux中如何在进程之间通信?,c,linux,process,real-time,preempt-rt,C,Linux,Process,Real Time,Preempt Rt,有很多例子说明了如何通过FSMLabs为RT-Linux编写实时代码,但是这个发行版在很多年前就被放弃了。目前,香草内核的PREEMPT\u RT补丁正在积极开发中,但官方Wiki上只有很少的代码示例。首先让我介绍一下我的问题 我正在写一个包含两个程序的项目: 字节码虚拟机-它必须作为实时应用程序工作-它有64 KB的I/O内存和64 KB的字节码 客户端程序-它将读取和写入I/O内存、启动/暂停机器、加载新程序、设置参数等。它不必是实时的 如何在这些进程之间进行通信以保持进程(1)的实时性并避

有很多例子说明了如何通过FSMLabs为RT-Linux编写实时代码,但是这个发行版在很多年前就被放弃了。目前,香草内核的PREEMPT\u RT补丁正在积极开发中,但官方Wiki上只有很少的代码示例。首先让我介绍一下我的问题

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

  • 字节码虚拟机-它必须作为实时应用程序工作-它有64 KB的I/O内存和64 KB的字节码
  • 客户端程序-它将读取和写入I/O内存、启动/暂停机器、加载新程序、设置参数等。它不必是实时的
  • 如何在这些进程之间进行通信以保持进程(1)的实时性并避免页面错误或其他可能干扰实时应用程序的行为

    方法1。仅使用线程

    有两个线程:

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

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

    方法2。共享内存

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

    方法3。命名管道

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


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

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