Низкоуровневая разделяемая память на iOS

Я пытаюсь построить блок разделяемой памяти на iOS. Компилирует и ссылки, но shmget() генерирует сигнал SIGSYS по самым невинным параметрам:

NSString *p = [[NSBundle mainBundle] pathForResource:@"crash" ofType: nil];
key_t tok = ftok([p UTF8String], 918273);
int mid = shmget(tok, 4096, IPC_CREAT|S_IRUSR|S_IWUSR);

tok большое положительное целое число, а не -1. Размер - попробовал 1024, тот же эффект.

Совместно ли SysV совместно использует память на iOS? Заголовки и библиотеки присутствуют, или компилятор / компоновщик будет жаловаться. Тот же код работает на симуляторе. Что я делаю неправильно?

Мой интерес проистекает из этого вопроса.

2 ответа

Решение

shm_open()/mmap() Комбо работает как рекламируется, как на симуляторе, так и на устройстве (протестировано на iOS 4) без каких-либо явных изменений разрешения.

Замечания: shm_open() странно задокументировано как вариадическое. В действительности вам нужно указать третий параметр с маской доступа - комбинация S_IRUSR-подобные флаги или восьмеричные chmod значение.

РЕДАКТИРОВАТЬ: похоже, что он сломался в iOS 7. shm_open возвращает -1 с errno=2 (ENOENT), даже если установлен флаг O_CREAT.

На iOS вы не можете использовать общую память вообще. Я не знаю точных деталей, но я знаю, что а) это для безопасности и б) это часть среды песочницы

Итак, я знаю выше от себя и своего присутствия на сцене джейлбрейка, однако вот несколько ссылок, описывающих песочницу и как они влияют на общую память

http://www.trailofbits.com/resources/ios4_security_evaluation_paper.pdf

http://lists.apple.com/archives/cocoa-dev/2012/Apr/msg00535.html

Другие вопросы по тегам