LINUX.ORG.RU

Разделяемая память: совместный доступ из Qt и POSIX-функций

 , ,


0

2

Привет, ЛОР.

Задача: сегмент разделяемой памяти пишет одна программа через shm_open(), ftruncate() и mmap(). Читает другая, через класс QSharedMemory. И наоборот.

Проблема в том, что Qt с целью кроссплатформенности видоизменяет имена сегментов разделяемой памяти. У QSharedMemory есть методы setKey() (Qt-only) и setNativeKey(), куда, по идее, передаётся платформозависимый ключ, в данном случае UNIX key name.

Когда у меня QSharedMemory на обоих концах, я работаю через setKey(), и всё работает замечательно.

Теперь я пытаюсь работать через setNativeKey(). Задаю ему имя, по образцу из native keys, которые Qt формирует сама, вроде /tmp/AnyName. После этого создание сегмента вроде бы проходит успешно (QSharedMemory::create() возвращает true), а вот QSharedMemory::lock() уходит в отказ, в сообщении об ошибке написано просто «can’t lock…».

У кого есть опыт такого кросс-библиотечного взаимодействия? Что делать?

Нашёл похожую тему на Stack Overflow, но там вопрошавший, кажется, так и остался в тупике.

★★★★★

Последнее исправление: hobbit (всего исправлений: 3)

QSharedMemory::lock() уходит в отказ

прям по твоей ссылке на SO ссылка на документацию, которая гласит:

Warning: QSharedMemory changes the key in a Qt-specific way, unless otherwise specified. Interoperation with non-Qt applications is achieved by first creating a default shared memory with QSharedMemory() and then setting a native key with setNativeKey(). When using native keys, shared memory is not protected against multiple accesses on it (for example, unable to lock()) and a user-defined mechanism should be used to achieve such protection.

aol ★★★★★
()

использовать QtCore вместо POSIX API в другой программе, которая не Qt-шная. Совсем не обязательно создавать GUI если использовать Qt.

anonymous
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария