Как каждый сохраняет интервал и массив в общей памяти в C?

UIColor не является изменяемым. Я обычно делаю это с цветами, шрифтами и изображениями. Вы можете легко изменить его для использования синглетонов или иметь статический инициализатор.

@interface UIColor (MyProject)

+(UIColor *) colorForSomePurpose;

@end

@implementation UIColor (MyProject)

+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }

@end
6
задан Josh 4 November 2009 в 03:08
поделиться

4 ответа

Вам понадобится увеличить размер вашей разделяемой памяти. Насколько большой вам нужен массив? Какое бы значение это ни было, вам нужно будет выбрать его перед созданием сегмента общей памяти - динамическая память здесь не будет работать слишком хорошо.

Когда вы подключаетесь к общей памяти, вы получаете указатель на начало адрес. Он будет достаточно хорошо выровнен для использования в любых целях. Таким образом, вы можете создать указатели на свои две переменные и массив вдоль этих строк (взяв часть скелета из примера кода) - обратите внимание на использование указателей для доступа к общей памяти:

enum { ARRAY_SIZE = 1024 * 1024 };
int segmentId;  
int *sharedInt1;
int *sharedInt2;
int *sharedArry;

const int shareSize = sizeof(int) * (2 + ARRAY_SIZE);  
/* Allocate shared memory segment */  
segmentId = shmget(IPC_PRIVATE, shareSize, S_IRUSR | S_IWUSR);  

/* attach the shared memory segment */    
sharedInt1 = (int *) shmat(segmentId, NULL, 0);
sharedInt2 = sharedInt1 + 1;
sharedArry = sharedInt1 + 2;

/* Rest of code will go here */
...fork your child processes...
...the children can use the three pointers to shared memory...
...worry about synchronization...
...you may need to use semaphores too - but they *are* complex...
...Note that pthreads and mutexes are no help with independent processes...  

/* detach shared memory segment */  
shmdt(sharedInt1);  
/* remove shared memory segment */  
shmctl(segmentId, IPC_RMID, NULL);
7
ответ дан 17 December 2019 в 00:11
поделиться

Это руководство выглядит полезным: http://www.cs.cf.ac .uk / Dave / C / node27.html . Он включает несколько примеров программ.

Есть также справочные страницы Linux в Интернете .

0
ответ дан 17 December 2019 в 00:11
поделиться

Из вашего комментария кажется, что вы используете IPC_PRIVATE , и это определенно выглядит неправильно («частные» типы предполагают, что он не предназначен для совместного использования, не так ли? -). Попробуйте что-нибудь вроде:

#include <sys/ipc.h>
#include <sys/shm.h>

...

int segid = shmget((key_t)0x0BADDOOD, shareSize, IPC_CREAT);
if (segid < 0) { /* insert error processing here! */ }
int *p = (int*) shmat(segid, 0, 0);
if (!p) { /* insert error processing here! */ }
0
ответ дан 17 December 2019 в 00:11
поделиться

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

Теперь у них обоих есть указатель на одну и ту же память, поэтому запись одной будет перезаписывать все, что там было, и другой имеет к нему немедленный доступ.

0
ответ дан 17 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: