IPC через запись в файлы?

У меня вопрос о межпроцессном взаимодействии в операционных системах.

Могут ли 2 процесса взаимодействовать друг с другом, когда оба процесса открывают один и тот же файл (который, как говорят, был создан до обоих процессов, поэтому оба процесса имеют обработчик файлов), а затем обмениваются данными, записывая в этот файл?

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

Предположим, что процессы записывают в файл в каком-то заранее согласованном протоколе/формате, поэтому у обоих не возникает проблем с знанием того, где другой процесс записывает и когда и т. д. Это предположение просто для понимания. Однако в реальном мире это может быть слишком строгим, чтобы соответствовать действительности и т. д.

Если нет, то что не так с этим сценарием? Дело в том, что если 2 разных процесса открывают один и тот же файл, то изменения, сделанные 1-м процессом, не сбрасываются в постоянное хранилище для просмотра другими, пока процесс не завершится? или что-то другое?

Любой реальный пример из Windows и Linux также должен быть полезен.

Спасибо,


person xyz    schedule 05.06.2011    source источник


Ответы (2)


Использование файла — это своего рода общая память. Вместо выделения общего буфера памяти в оперативной памяти используется общий файл.

Для успешного управления связью необходим какой-то механизм блокировки для разных диапазонов в файле. Это может быть либо блокировка диапазонов, предоставляемая файловой системой (доступная по крайней мере в Windows), либо глобальные мьютексы операционной системы.

Одним из реальных сценариев, в котором дисковое хранилище используется для межпроцессного взаимодействия, является диск кворома, используемый в кластерах. Это общий дисковый ресурс, доступный через SAN для всех узлов кластера, на котором хранится конфигурация кластера.

person Anders Abel    schedule 05.06.2011

Системный вызов posix mmap выполняет сопоставление файлов с виртуальной памятью. Если сопоставление совместно используется двумя процессами, запись в эту область в одном процессе повлияет на другие процессы. Теперь к вам вопрос, да, процесс, читающий или записывающий в базовый файл, не всегда будет видеть те же данные, что и процесс, который его сопоставил, поскольку сегмент файла копируется в ОЗУ и периодически сбрасывается на диск. Хотя я считаю, что вы можете принудительно выполнить синхронизацию с помощью системного вызова msync. Почитайте о mmap(). Он имеет множество других вариантов совместного использования памяти.

person Kakira    schedule 07.06.2011