有很多例子说明如何用FSMLabs为RT-Linux编写实时代码,但是这个发行版多年前已经被废弃了。目前正在积极开发用于香草内核的PREEMPT_RT补丁,但官方Wiki上只有很少的代码示例。首先让我介绍一下我的问题。
我正在编写一个包含2个程序的项目:
如何在这些进程之间进行通信以保持进程(1)的实时性并避免页面错误或其他可能干扰实时应用程序的行为?
方法1.仅使用线程
有两个主题:
具有最高优先级的虚拟机线程
具有与用户和机器通信的正常优先级的客户端线程 两个线程都可以按名称访问所有全局变量。我可以在每个机器周期后为传入/传出数据创建额外的缓冲区。但是,如果客户端线程导致应用程序崩溃,则机器线程也将终止。实现远程访问也更加困难。
方法2.共享内存
在旧的FSMLabs中,建议在进程之间使用共享的全局内存。现代PREEMPT_RT的Wiki页面建议使用mmap()进行流程数据共享,但在同一篇文章中,由于页面错误,它不鼓励使用mmap()。
方法3.命名管道
它是在流程之间进行通信的更灵活的方式。但是,我是Linux新编程的新手。我们希望在机器和客户端之间共享内存,但它也应该提供一种加载新程序(文件路径或程序代码),停止/启动机器等的方法。旧的FSMLabs RT-Linux实现了自己的FIFO队列(命名管道)。现代PREEMPT_RT没有。可以使用名称管道打破实时行为吗?怎么做得好?我应该使用O_NONBLOCK标志读取数据还是创建另一个线程来从/向管道读取/写入数据?
您是否知道在一个流程必须实时的流程之间进行通信的其他方式?也许我只需要线程。但是,请考虑更多客户端连接到虚拟机进程的方案。
答案 0 :(得分:1)
要在同一主机操作系统上执行的进程之间交换数据,您还可以使用UNIX域套接字。