在 Linux 上的两个应用程序之间共享数据
Sharing data between two applications on Linux
我有两个进程在Linux上运行,一个是NodeJs应用程序,另一个是C++应用程序。NodeJs 应用程序从服务器接收数据,服务器也是一个 NodeJS 应用程序,现在这些数据将由C++应用程序使用。
现在,我正在从 NodeJs 应用程序将数据写入文本文件中,然后从C++应用程序读取它。但这很慢,也会导致问题,因为文件可以异步写入。
我的问题是,在这两个应用程序之间共享数据的最佳方式是什么,请记住数据可以异步接收?
在 NodeJS 中为C++应用程序创建 REST API。(C++ 客户端:https://github.com/mrtazz/restclient-cpp)。
例:
var express = require('express');
var app = express();
app.get('/data', function (req, res) {
var dataObjectToSendHere = 'here';
res.json(dataObjectToSendHere);
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("Example app listening at http://%s:%s", host, port)
})
为了进一步帮助您,您需要两件事:将数据从一个应用程序发送到另一个应用程序(您现在使用的文件),以及从一个进程异步发出另一个进程的信号(告诉它数据可用)。
实际上,您可以对文件执行此操作,但不是仅使用单个文件,而是使用多个文件,每次有新数据时一个。将它们写入另一个进程监视更改的特殊目录中,当它检测到新文件时,它只是读取该文件,然后将其删除。
另一种方法是通过命名管道或套接字(本地(即 AF_LOCAL
)或"正常")。然后在TCP或UDP之上发明一个简单的协议,可以处理信令和批量数据传输。
当然,由于一个应用程序是节点.js应用程序,您可以简单地使用类似 REST 的接口,并让另一个程序轮询新数据。为此,您不需要任何类型的异步信令,相反,node.js应用程序收集和缓存所有传入的数据,当其他应用程序轮询数据时,您传输自上次轮询以来到达的所有数据。
还有许多其他方法可以做到这一点,只需阅读我在评论中链接到的文章即可了解有关所有这些方法的更多信息。
正如其他人指出的那样,有多种进程间通信方式,例如消息传递、共享内存、文件等。在这里,我想推荐一种反应式方法来解决此问题,因为正如您提到的,数据可以异步传输。您可以使用内存中数据源(如 redis)向其读取和写入数据。它应该提供与节点js的良好集成,这是一个没有sql的数据库。这将帮助您减少文件 I/O 的延迟。现在,您可以构建发布者/订阅者范例,订阅者将收到有关数据库中任何更改的通知。Redis 为此提供了一个接口。如果有疑问,请告诉我。
使用带有本地主机的套接字,我认为很好。
- 比较两个字符串数组,我的控制台应用程序"stops responding"
- 应用程序中的两个不同版本的库
- 如何将比较运算符应用于两个匿名结构中的每个变量
- 使用 QT 开发服务器应用程序是个好主意吗?(QT5)
- 同一个应用程序中的同一库的两个版本
- 在不使用递归的情况下将 FFT 应用于两个非常大的数字的乘法
- 一个解决方案,两个项目:如何从 Windows 应用程序调用控制台项目?C++
- 如何在 C++ 控制台应用程序中将输入与输出分开?我可以有两个游标吗?
- PHP shell_exec不适用于两个不同的应用程序版本
- 在一个应用程序中创建两个窗口
- 在Windows 8 metro应用程序上同步两个ppl任务
- 在两个单独的应用程序之间共享 dll 中的堆内存
- 在C++控制台应用程序中运行两个线程
- 关于在omnetpp.ini中将两个不同的应用程序随机分配到50个节点
- 在 Linux 上的两个应用程序之间共享数据
- 我是否需要锁才能同时使用同一应用程序两次写入套接字
- 如何使用WindowsFormApplication按钮在两个Windows应用程序之间切换(强制它们顶部)
- 如何使用OpenGL在Windows上的同一应用程序中的两个单独的3D窗口中进行绘制
- Pantheios 不使用 MFC 应用程序写入一个文件(一个 exe + 两个 DLL)
- 在 MFC 应用程序中,如何使用两个计时器