摆脱基于文件的通信

时间:2010-08-06 06:08:09

标签: c linux memory file-io

我必须使用两个通过基于文件的界面进行通信的C程序。也就是说,它们中的每一个都有一个主循环,它在其中轮询三个或四个文件(fopen,fscanf),对它读取的内容作出反应,并最终对文件(fprintf)进行自己的更改以供另一个进程读取。

现在我必须将这两个程序压缩成一个程序,对程序逻辑和代码进行一般性的改动很少。但是,主要是出于审美原因,我应该用内存中的内容替换基于文件的通信。

我可以想象一些hacky方法来实现这一点,但我确信stackoverflow会给我一个漂亮解决方案的暗示:)

5 个答案:

答案 0 :(得分:5)

由于您标记了此Linux,我将建议open_memstream。它被添加到POSIX与POSIX 2008,但它已经在基于glibc的Linux系统上使用了很长时间。基本上它允许你打开FILE *,它实际上是内存中动态增长的缓冲区,因此你不必更改太多代码。这个“文件”是只写的,但您只需在缓冲区上使用sscanf而不是fscanf来读取它,或使用fmemopen(没有动态增长)语义,但从内存缓冲区读取非常方便。)

答案 1 :(得分:0)

RabbitMQ是一个非常强大/优雅的事件处理解决方案。在过去几年与国家机器混合之后,这已经是一股清新的空气。还有其他带有C lib的消息服务器,如OPenAMQ。

答案 2 :(得分:0)

由于您标记了这个Linux,我建议将通信文件放在/ dev / shm上。这样你可以用基于内存的通信替换基于文件的通信,而不会实际改变任何应用程序逻辑: - )

答案 3 :(得分:0)

你说你已经将读者/作家进程压缩成一个程序。 那么,现在你有不同的线程用于此目的? 如果是这样,我认为一个互斥保护的全局缓冲区应该能够很好地满足这个目的。

答案 4 :(得分:-1)

使用带有sscanf和sprintf的全局字符串而不是文件。