C 摆脱基于文件的通信
我必须使用两个通过基于文件的接口进行通信的C程序。也就是说,它们中的每一个都有一个主循环,在主循环中它轮询三个或四个文件(fopen、fscanf),对读取的内容做出反应,并最终对文件(fprintf)进行自己的更改,以供另一个进程读取 现在,我必须将这两个程序压缩成一个程序,对程序逻辑和代码的更改一般都很小。然而,主要是出于美学原因,我应该用内存中的东西来取代基于文件的通信C 摆脱基于文件的通信,c,linux,memory,file-io,C,Linux,Memory,File Io,我必须使用两个通过基于文件的接口进行通信的C程序。也就是说,它们中的每一个都有一个主循环,在主循环中它轮询三个或四个文件(fopen、fscanf),对读取的内容做出反应,并最终对文件(fprintf)进行自己的更改,以供另一个进程读取 现在,我必须将这两个程序压缩成一个程序,对程序逻辑和代码的更改一般都很小。然而,主要是出于美学原因,我应该用内存中的东西来取代基于文件的通信 我可以想象一些黑客的方法来实现这一点,但我相信stackoverflow会给我一个漂亮的解决方案的提示:)使用带有ssc
我可以想象一些黑客的方法来实现这一点,但我相信stackoverflow会给我一个漂亮的解决方案的提示:)使用带有sscanf和sprintf的全局字符串而不是文件。既然您标记了这个Linux,我建议
打开memstream
。它是在POSIX 2008中添加到POSIX的,但是它在基于glibc的Linux系统上已经存在很长时间了。基本上,它允许您打开一个文件*
,该文件实际上是内存中一个动态增长的缓冲区,因此您不必更改太多代码。这个“文件”是只写的,但是您可以简单地在缓冲区上使用sscanf
而不是fscanf
来读取它,或者使用fmemopen
(它没有动态增长语义,但非常方便从内存缓冲区中读取)。RabbitMQ是一个非常健壮/优雅的事件处理解决方案。在过去的几年里,在与国家机器打交道之后,这是一股新鲜空气。还有其他带有C库的消息服务器,比如OPenAMQ 既然您标记了这个Linux,我建议将通信文件放在/dev/shm上。通过这种方式,您可以将基于文件的通信替换为内存中的通信,而不会实际更改任何应用程序逻辑:-)您可以说您已将读写器进程压缩为单个程序。
那么,现在你有了不同的线程?
如果是这样的话,我认为互斥保护的全局缓冲区应该可以很好地达到这个目的 听起来很合理,但需要我更换/删除fopen、fclose等呼叫。还检查文件是否存在。不过,这当然是一个不错的解决方案,但让我们看看其他人想出了什么:)这可能也是考虑添加一些抽象的时候了。不要直接使用
fopen()
、fclose()
等功能,而是将这些功能替换为HLINK open\u link()
、close\u link(HLINK)
、read\u link\u data(HLINK)
等功能。其中HLINK
是“某物”的类型定义,这取决于您决定使用的机制。因此,如果您以后再次进行此练习,您只需更改类型定义和一些函数。如果您不想更改代码,您可以定义fscanf sscanf等。