Хранение значения в памяти независимо от процесса - PullRequest
2 голосов
/ 20 мая 2010

Мне нужен способ для временного хранения значения где-нибудь, скажем, Процесс A. Процесс A может выйти из после сохранения значения в памяти. Через некоторое время процесс B получает доступ к той же ячейке памяти и читает значение. Мне нужно хранить в памяти, потому что я не хочу, чтобы данные сохранялись при перезагрузке. Но пока система работает, независимо от процесса данные должны быть доступны. Я пробовал MailSlots и Временные файлы в Windows, оба, кажется, имеют проблему, когда счетчик ссылок на процессы падает до нуля, объекты не сохраняются в памяти. Каков подходящий механизм для этого в Windows, предпочтительно с использованием Win32 API?

  • Ганеш

Ответы [ 4 ]

4 голосов
/ 20 мая 2010

Напишите службу, которая запускается во время загрузки, и дайте ей создать общую память. Затем эта общая память может быть заполнена процессом A, а процесс B может прочитать ее позже.

Если ваша система перезагружена, общая память исчезла, и у вас появился новый, новый раздел общей памяти. Убедитесь, что ваш сервис правильно «инициализирует» разделяемую память.

1 голос
/ 21 мая 2010

Есть ли причина, по которой данные должны храниться в памяти, когда ProcessA завершает работу, а не храниться где-то на диске? Я спрашиваю, как вы упоминаете временные файлы, которые должны работать, если ProcessA неожиданно завершится с ошибкой.

В зависимости от ваших потребностей, хорошим способом предоставления общих / быстрых / элементарных данных является ESENT API .

0 голосов
/ 22 мая 2010

Ну, мне удалось создать MailSlot в Процессе, который не завершается, два других Процесса могут читать и записывать на сервер MailSlot как клиенты ... Даже если клиенты завершают работу, Mailslot все равно будет иметь данные. .. сервер MailSlot позволяет мне хранить данные в энергозависимой памяти до тех пор, пока процесс сервера MailSlot запущен .. или ОС запущена .. и исчезает при перезагрузке ОС ... Спасибо за все идеи и помощь .... :)

0 голосов
/ 21 мая 2010

Попробуйте следующее. Не могу сказать, что знаю, что это работает, но это кажется разумным.

Создайте файл общей памяти в глобальном пространстве имен, используя OpenFileMapping . Затем вызовите Duplicatehandle и для дескриптора целевого процесса используйте некоторый процесс, который будет жить дольше, чем процесс A. Возможно, вы сможете добавить дескриптор в winlogon.exe. Это должно предотвратить разрушение общей памяти при процессе A завершается. Затем в процессе B вы можете найти файл общей памяти.

...