Вопрос по Shared memory (Разделяемая память).
Ты не мог бы задать вопрос более конкретно?
Это ж обычная память с точки зрения C. Используй memcpy.
я просто плохо сам в этом всем пока разбираюсь, мне надо чтобы в разделяемую память был записан массив типа int
учти, что тут в полный рост проявляются межпроцессные взаимодействия, потому может потребоваться синхронизация семафорами, мутексами итд
Shared память - это обычная память, на которую указывают таблицы страниц нескольких процессов. Поскольку таблицы страниц прозрачно обрабатываются процессором, отличить Shared-память от какой-либо другой не возможно.
отличить Shared-память от какой-либо другой не возможно.Зачем тогда нужно это?
The process-shared attribute is set to PTHREAD_PROCESS_SHARED to permit a mutex to be operated upon by any thread that has access to the
memory where the mutex is allocated, even if the mutex is allocated in memory that is shared by multiple processes. If the process-
shared attribute is PTHREAD_PROCESS_PRIVATE, the mutex shall only be operated upon by threads created within the same process as the
thread that initialized the mutex; if threads of differing processes attempt to operate on such a mutex, the behavior is undefined.
В приведённом куске манов речь идёт про мьютексы, а не про разделяемую память. Это разные инструменты синхронизации.
Это я к тому, что если бы не было разницы между шареной и не шареной памятью, я мог бы положить туда мьютекс и использовать из нескольких процессов одновременно. Из этого мана следуют, что есть разница. Хотя бы в отношении pthread-объектов.
Там идет речь про process-shared, то бишь разделяемая между процессами, а в топике про shared, разделяемую между потоками.
а в топике про shared, разделяемую между потокамиЭто как?

// contains shared memory objects
int sharedIntArray[100];

Тут говорится о том, как правильно создавать мьютексы, чтобы их можно было использовать из других процессов. Если мьютекс не в shared-памяти, то обеспечить корректный доступ из других процессов разумеется нельзя, поэтому и беспокоится не о чем. Вместо этого создают именнованные мьютексы, которые располагаются в ядре.
Это как?У тредов же вообще память общая, так что топик про разделяемую между процессами память.
Там идет речь про process-shared, то бишь разделяемая между процессами, а в топике про shared, разделяемую между потоками.Во всех системах, в которых я работал или о которых когда-либо слышал, память между потоками всегда разделяемая.
Во всех системах, в которых я работал или о которых когда-либо слышал, память между потоками всегда разделяемая.Бывает ступил. =) Но есть такая штука как TLS
я мог бы положить туда мьютекс и использовать из нескольких процессов одновременно.очень спорное утверждение.
например, в shared memory нельзя также класть ссылочные структуры (вернее можно, но работать с ними нормально не получится) и т.д.
а mutex - это же ссылочная структура - это ссылка на объект ядра, соответственно нет никаких гарантий - что эти ссылки будут работать в другом процессе.
например, в shared memory нельзя также класть ссылочные структурыСпасибо за еще один довод в пользу того, что shared память != обычная память.
Спасибо за еще один довод в пользу того, что shared память != обычная память.мне не нравится сама формулировка утверждения...
shared memory, как память, самая обычная - в ней можно хранить и ссылочные структуры, и mutex-ы, если использовать их только из под того же процесса, который положил, и можно даже очень-очень аккуратно использовать такие структуры из под другого процесса.
а необычность появляется у данных, когда забывается, что:
1. многие данные имеют неявную привязку к конкретному процессу (как те самые ссылочные структуры, и mutex-ы).
2. при использовании shared-memory происходит неявная передача данных между процессами
если эти же данные тупо (в виде бинарного образа из памяти) передавать другими способами (например, через socket/pipe) между процессами, то проблемы будут все те же самые.
Оставить комментарий
ivan84
У меня следующая проблема:Я хочу создать объект разделяемой памяти, в который будет записан массив данных для дальнейшего использования.
Я пишу программу в QNX Momentics.
Я нашел описание того как можно это сделать для строки:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <inttipes.h>
int main
{
int fd, status;
void* buffer;
fd = shm_open("/swd_es", O_RDWR | O_CREAT, 0777);
status = ftruncate(fd, 100);
buffer = mmap(0, 100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
sprintf(buffer, "It's a nice day today, isn't it?");
printf("shm_creator: %s\n", buffer);
return EXIT_SUCCESS;
}