摆脱基于文件的通信

3
我需要与两个通过基于文件的接口进行通信的C程序一起工作。也就是说,它们中的每一个都有一个主循环,在其中轮询三到四个文件(fopen,fscanf),根据读取的内容做出反应,并最终对文件进行自己的更改(fprintf),以便另一个进程可以读取。

现在我必须将这两个程序压缩成一个单独的程序,尽可能少地更改程序逻辑和代码。然而,主要是为了美观起见,我应该用内存中的某些东西替换基于文件的通信。

我可以想象几种hacky的方法来实现这一点,但我相信stackoverflow会给我提供一个漂亮的解决方案 :)

5个回答

5

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


0

RabbitMQ是一个非常强大/优雅的事件处理解决方案。在过去几年里,我一直在搞状态机,这真是一股清新之风。还有其他带有C库的消息服务器,如OPenAMQ。


0

既然您标记了这个问题为Linux,我建议将通信文件放在/dev/shm上。 这样,您就可以用基于内存的通信来代替基于文件的通信,而不必实际更改任何应用程序逻辑 :-)


0
你说你已经将Reader/Writer进程压缩为一个程序。 那么,现在你为此目的有不同的线程吗? 如果是这样,我认为可以使用互斥保护的全局缓冲区来很好地达到这个目的。

-1

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


听起来很合理,但需要我替换/删除fopen、fclose等调用。还有检查文件是否存在的部分。不过这肯定是一个可以接受的解决方案,但让我们看看其他人想出了什么 :) - nisc
这也许是考虑添加一些抽象的时候了。不要直接使用fopen()fclose()等,而是用诸如HLINK open_link()close_link(HLINK)read_link_data(HLINK)等函数替换它们,其中HLINK是一个typedef为“something”的东西,这将取决于您决定使用的机制。因此,如果将来再次进行这种练习,您只需要更改类型定义和一些函数即可。 - Praetorian
如果您不想更改代码,您可以随时使用 #define fscanf sscanf 等等。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接