Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 摆脱基于文件的通信_C_Linux_Memory_File Io - Fatal编程技术网

C 摆脱基于文件的通信

C 摆脱基于文件的通信,c,linux,memory,file-io,C,Linux,Memory,File Io,我必须使用两个通过基于文件的接口进行通信的C程序。也就是说,它们中的每一个都有一个主循环,在主循环中它轮询三个或四个文件(fopen、fscanf),对读取的内容做出反应,并最终对文件(fprintf)进行自己的更改,以供另一个进程读取 现在,我必须将这两个程序压缩成一个程序,对程序逻辑和代码的更改一般都很小。然而,主要是出于美学原因,我应该用内存中的东西来取代基于文件的通信 我可以想象一些黑客的方法来实现这一点,但我相信stackoverflow会给我一个漂亮的解决方案的提示:)使用带有ssc

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

现在,我必须将这两个程序压缩成一个程序,对程序逻辑和代码的更改一般都很小。然而,主要是出于美学原因,我应该用内存中的东西来取代基于文件的通信


我可以想象一些黑客的方法来实现这一点,但我相信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等。