linux 实时通信,如何在实时Linux中进程间进行通信?

本文探讨了在RT-Linux环境中实现实时虚拟机与客户端程序之间的高效进程间通信(IPC)的方法。主要讨论了三种IPC策略:使用线程、共享内存及命名管道,并对比了它们在实时性方面的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有很多例子说明如何用FSMLabs为RT-Linux编写实时代码,但这个发行版多年前已经被废弃了.目前正在积极开发用于香草内核的PREEMPT_RT补丁,但官方Wiki上只有很少的代码示例.首先让我介绍一下我的问题.

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

>字节代码的虚拟机 – 它必须作为实时应用程序工作 – 它具有64 KB的I / O内存和64 KB的字节代码.

>客户端程序 – 它将读写I / O内存,启动/暂停机器,加载新程序,设置参数等.它不一定是实时的.

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

方法1.仅使用线程

有2个主题:

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

>具有与用户和机器通信的正常优先级的客户端线程

两个线程都可以按名称访问所有全局变量.我可以在每个机器周期后为传入/传出数据创建额外的缓冲区.但是,如果客户端线程导致应用程序崩溃,则机器线程也将终止.实现远程访问也更加困难.

方法2.共享内存

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

方法3.命名管道

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

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

解决方法:

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

标签:c-3,linux,process,real-time,preempt-rt

来源: https://codeday.me/bug/20190708/1401340.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值