Я в настоящее время переношу существующий код Win32 в Linux. В Windows у меня есть «главный» процесс, «читатель», который создает объект общей памяти, а затем ожидает, что некоторые «подчиненные» процессы, «писатели», помещают данные в разделяемую память для обработки.Использование fstat между shm_open и mmap
Мастер-процесс: реализация Win32 основана на CreateFileMapping(INVALID_HANDLE_VALUE, [...]
, а затем на MapViewOfFile
. Размер общей памяти si, указанный в вызове CreateFileMapping
. Передача 0 в качестве последнего аргумента в MapViewOfFile
обеспечивает отображение всей общей памяти. В Linux после некоторых поисковых запросов я пришел к выводу, что должен использовать shm_open
+ ftruncate
+ mmap
.
Подчиненных процессы: реализация Win32, почти такие же, как и в процессе Master, за исключением того, что CreateFileMapping
заменяется OpenFileMapping
, и что VirtualQuery
может быть использован для получения размера совместно используемой памяти.
В Linux у меня проблема: «подчиненные» процессы должны как-то «подождать» для завершения вызова ftruncate
в «основном» процессе. Они не могут делать ftruncate
сами по себе, так как у них еще нет идей об объеме общей памяти.
Было бы нормально, если процессы «ведомого» были опросом на fstat
beetwen shm_open
и mmap
? Или это плохая практика, и если да, есть ли другой способ «хорошего» размера?
EDIT:
В настоящее время, я не хочу, чтобы напрямую использовать файловую систему. Мне нравится, что я могу создать «Именованный общий объект памяти», используя «имя», которое будет работать на двух платформах, как "/MySharedMemName42"
и не хочет заботиться о местоположении (-ях) файла (ов). Я могу изменить свое мнение, если оно кажется нереалистичным.
Я знаю, что мастер-процесс и подчиненные процессы должны взаимодействовать при использовании общей памяти. Они делают это с записью/чтением памяти. «Проблема» в том, что shm_open/mmap может привести к SIGBUS в подчиненных устройствах, если есть расы (ftruncate опоздал в мастер). Я тестировал, что «fstat pollling» делает трюк, но хочет знать, считается ли это ужасным взломом или правильным способом справиться с гонкой.
Как вы разрешить гонки между 'CreateFileMapping' в master и' OpenFileMapping' в подчиненных? – chill
@chill Какая гонка? Если OpenFileMapping терпит неудачу, ведомые выполняют то, что они хотят (повторите?). Если OpenFileMapping завершится успешно, они могут MapViewOfFile без страха. – manuell
Ключом к любому из этого является взаимодействие процессов. Некоторые системы имеют отдельный процесс в начале и в конце дня для создания и развязки их разделяемой памяти до запуска приложений (серва или клиента). Некоторые из них имеют механизмы (например, блокировки файлов, семафор и т. Д.) Для координации упорядоченной загрузки процессов, например. нет сервера, тогда клиенты не запускаются. – Duck