Низкоуровневая разделяемая память на 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