Вы можете посмотреть на создание объекта совместно используемой памяти, используя shmget()
, shmat()
и т. Д. Сначала запустите процесс, который получает право инициализировать считанный в вашем файле объект совместно используемой памяти и скопировать его в адрес объекта совместно используемой памяти. пространство. Теперь любой другой процесс, который просто получает возвращаемое значение идентификатора совместно используемой памяти, может получить доступ к данным в пространстве совместно используемой памяти. Так, например, вы можете использовать схему инициализации типа, такую как:
#include <sys/shm.h>
#define KEYVALUE 1000 //arbitrary value ... just needs to be shared between your processes
int file_size
//read your file and obtain its size in bytes;
//try to create the shared memory object
int shared_mem_id;
void* shared_mem_ptr = NULL;
if ((shared_mem_id = shmget(KEYVALUE, file_size, S_IRUSR | S_IWUSR IPC_CREAT | IPC_EXCL)) == -1)
{
if (errno == EEXIST)
{
//shared memory segment was already created, so just get its ID value
shared_mem_id = shmget(KEYVALUE, file_size, S_IRUSR | S_IWUSR);
shared_mem_ptr = shmat(shared_mem_id, NULL, 0)
}
else
{
perror("Unable to create shared memory object");
exit(1);
}
}
else
{
shared_mem_ptr = shmat(shared_mem_id, NULL, 0);
//copy your file into shared memory via the shared_mem_ptr
}
//work with the shared data ...
Последний процесс, использующий объект совместно используемой памяти, непосредственно перед его уничтожением скопирует измененное содержимое из совместно используемой памяти обратно в фактический файл. Возможно, вы также захотите выделить структуру в начале вашего объекта общей памяти, которую можно использовать для синхронизации, т. Е. Будет некоторый тип «магического числа», которое будет установлен процессом инициализации, чтобы ваши другие процессы знали, что данные были правильно инициализированы в объекте общей памяти перед доступом к нему. В качестве альтернативы можно использовать именованный семафор или семафор System V, чтобы убедиться, что ни один процесс не пытается получить доступ к объекту общей памяти до его инициализации.