开发者

Getting rid of file-based communication

开发者 https://www.devze.com 2023-01-10 06:05 出处:网络
I have to work with two C programs that communicate via a file-based interface. That is, each of them has a main loop where it polls three开发者_如何学Python or four files (fopen, fscanf), reacts to w

I have to work with two C programs that communicate via a file-based interface. That is, each of them has a main loop where it polls three开发者_如何学Python or four files (fopen, fscanf), reacts to what it reads and eventually makes its own changes to the files (fprintf) for the other process to read.

Now I have to condense these two programs into a single program, with minimal changes to the program logic and the code in general. However, mainly for aesthetic reasons I'm supposed to replace the file-based communication with something in-memory.

I can imagine a few hacky ways to accomplish this, but I'm sure that stackoverflow will give me a hint at a beautiful solution :)


Since you tagged this Linux, I'm going to suggest open_memstream. It was added to POSIX with POSIX 2008, but it's been available on glibc-based Linux systems for a long time. Basically it lets you open a FILE * that's actually a dynamically-growing buffer in memory, so you wouldn't have to change much code. This "file" is write-only, but you could simply use sscanf instead of fscanf on the buffer to read it, or use fmemopen (which doesn't have the dynamic-growth semantics but which is very convenient for reading from in-memory buffers).


RabbitMQ is a really robust/elegant solution for event processing. After mucking with state machines for the past few years this has been a breath of fresh air. There are other messaging servers with C libs like OPenAMQ.


Since you tagged this Linux, I'd suggest putting the communication files on /dev/shm. That way you sort-of replace the file-based communication with an in-memory one, without actually altering any of the application logic :-)


You say that you have condensed the reader / Writer Processes into a single Program. So, now you have different threads for the purpose? If so, i think a mutex-guarded global buffer should serve the purpose well enough.


Use a global string with sscanf and sprintf instead of a file.

0

精彩评论

暂无评论...
验证码 换一张
取 消