摆脱基于文件的通信

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

现在我不得不将这两个程序压缩成一个程序,只需对程序逻辑和代码进行最小的修改。 不过,主要是出于美学原因,我应该用内存中的东西来replace基于文件的通信。

我可以想象一些hacky的方式来完成这一点,但我敢肯定,stackoverflow会给我一个美丽的解决scheme提示:)

既然你标记了这个Linux,我会建议open_memstream 。 它被POSIX 2008添加到了POSIX,但是它已经在基于glibc的Linux系统上使用了很长时间了。 基本上它可以让你打开一个FILE * ,这实际上是一个动态增长的缓冲区,所以你不需要改变太多的代码。 这个“文件”是只写的,但是你可以简单地在缓冲区中使用sscanf而不是fscanf来读取它,或者使用fmemopen (它没有动态增长的语义,但是对于从内存中读取来说非常方便缓冲区)。

RabbitMQ是一个非常强大/优雅的事件处理解决方案。 在过去的几年中,国家机器的使用已经成为一种新鲜空气。 还有其他类似OPenAMQ的C库的消息服务器。

既然你标记了这个Linux,我建议把通信文件放在/ dev / shm上。 这样你就可以用基于文件的通信替换内存中的通信,而不用改变任何应用逻辑:-)

你说你已经把读者/作者进程压缩成一个程序。 那么现在你有不同的线索呢? 如果是这样,我认为一个互斥守卫的全局缓冲区应该足够好。

使用sscanf和sprintf代替文件的全局字符串。