У меня небольшая проблема с одним из моих проектов.
Я пытался найти хорошо документированный пример использования разделяемой памяти, fork()
но безуспешно.
В основном сценарий таков, что когда пользователь запускает программу, мне нужно сохранить два значения в общей памяти: current_path, который является символом *, и имя_файла, которое также является символом * .
В зависимости от аргументов команды запускается новый процесс, fork()
и этот процесс должен прочитать и изменить переменную current_path, хранящуюся в общей памяти, в то время как переменная file_name доступна только для чтения.
Есть ли хороший учебник по общей памяти с примером кода (если возможно), к которому вы могли бы направить меня?
c
linux
fork
shared-memory
bleepzter
источник
источник
shmget()
и др. а также чистыйmmap()
подход сMAP_ANON
(akaMAP_ANONYMOUS
) - хотяMAP_ANON
и не определен в POSIX. Также есть POSIXshm_open()
иshm_close()
для управления объектами разделяемой памяти. [… Продолжение…]shm_unlink()
), тогда как механизмы, использующие,mmap()
требуют файл иMAP_SHARED
сохраняются данные (иMAP_ANON
исключает постоянство). Полный пример приведен в разделе «Обоснование» спецификацииshm_open()
.Ответы:
Есть два подхода:
shmget
иmmap
. Я расскажу об этомmmap
, поскольку он более современный и гибкий, но вы можете взглянутьman shmget
( или этот учебник ), если предпочитаете инструменты старого стиля.Эту
mmap()
функцию можно использовать для выделения буферов памяти с настраиваемыми параметрами для управления доступом и разрешениями, а также для их поддержки с помощью хранилища файловой системы, если это необходимо.Следующая функция создает буфер в памяти, которым процесс может поделиться со своими дочерними элементами:
Ниже приведен пример программы, которая использует определенную выше функцию для выделения буфера. Родительский процесс напишет сообщение, fork, а затем будет ждать, пока его дочерний процесс изменит буфер. Оба процесса могут читать и записывать общую память.
источник
shmget
это действительно старомодный, и некоторые сказали бы, что устаревший способ работы с разделяемой памятью ... Лучше использоватьmmap
иshm_open
, простые файлы, или простоMAP_ANONYMOUS
.Вот пример общей памяти:
Шаги:
Используйте ftok для преобразования имени пути и идентификатора проекта в ключ System V IPC
Используйте shmget, который выделяет сегмент разделяемой памяти
Используйте shmat, чтобы прикрепить сегмент разделяемой памяти, идентифицированный shmid, к адресному пространству вызывающего процесса.
Сделайте операции с областью памяти
Отключить с помощью shmdt
источник
Они предназначены для использования общей памяти
источник
попробуйте этот образец кода, я его тестировал, источник: http://www.makelinux.net/alp/035
источник
shmget
иshmat
из другого процесса), что является своего рода целым смыслом общей памяти ... = (Вот пример mmap:
источник
open
добавляет накладные расходы файлового ввода-вывода.shm_open
Вместо этого используйте .