Избавляемся от файловой связи - PullRequest
3 голосов
/ 06 августа 2010

Мне приходится работать с двумя программами на Си, которые общаются через файловый интерфейс.То есть каждый из них имеет основной цикл, в котором он опрашивает три или четыре файла (fopen, fscanf), реагирует на то, что он читает, и в конечном итоге вносит свои изменения в файлы (fprintf), чтобы другой процесс мог их прочитать.

Теперь мне нужно объединить эти две программы в одну программу с минимальными изменениями в логике программы и коде в целом.Тем не менее, в основном по эстетическим соображениям я должен заменить файловую связь чем-то в памяти.

Я могу представить несколько хакерских способов сделать это, но я уверен, что stackoverflow даст мненамек на красивое решение:)

Ответы [ 5 ]

5 голосов
/ 06 августа 2010

Поскольку вы пометили этот Linux, я собираюсь предложить open_memstream.Он был добавлен в POSIX вместе с POSIX 2008, но он уже давно доступен в Linux-системах на основе glibc.По сути, это позволяет вам открыть FILE *, который на самом деле является динамически растущим буфером в памяти, так что вам не придется сильно менять код.Этот «файл» предназначен только для записи, но вы можете просто использовать sscanf вместо fscanf в буфере для чтения или использовать fmemopen (который не имеет семантики динамического роста, но который очень удобендля чтения из буфера в памяти).

0 голосов
/ 09 августа 2010

Вы говорите, что объединили процессы чтения / записи в одну программу. Итак, теперь у вас есть разные темы для этой цели? Если так, то я думаю, что глобальный буфер с мьютексной защитой должен служить цели достаточно хорошо.

0 голосов
/ 06 августа 2010

Поскольку вы пометили этот Linux, я бы посоветовал поместить файлы связи в / dev / shm.Таким образом, вы как бы заменяете связь на основе файлов с обменом в памяти, фактически не изменяя логику приложения:

0 голосов
/ 06 августа 2010

RabbitMQ - действительно надежное и элегантное решение для обработки событий. После нескольких лет работы с государственными машинами это был глоток свежего воздуха. Есть и другие серверы обмена сообщениями с библиотеками, такие как OPenAMQ.

0 голосов
/ 06 августа 2010

Используйте глобальную строку с sscanf и sprintf вместо файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...