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
()
Ответ на: комментарий от anonymous

Я в курсе, я писал на голом QtCore и даже на связке QtCore+QtNetwork без GUI. Но тут хотелось бы «негуёвую» программу сделать по возможности минималистичной.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от aol

Да. Убедил.

Теперь пытаюсь в posix-овом процессе создавать сегмент, а в Qt-шном его читать. На передающем конце вызываю shm_open("/MassShMemTest", O_CREAT...), делаю ftruncate и mmap – ошибок не возвращается.. На Qt-шном создаю объект, вызываю setNativeKey("/MassShMemTest"), потом attach(QSharedMemory::ReadOnly)… и получаю ошибку:

QSharedMemory::handle:: UNIX key file doesn't exist

Насколько я понимаю, в setNativeKey() должно передаваться то же имя, что фигурировало в shm_open? Я, вроде, так и делаю.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Но тут хотелось бы «негуёвую» программу сделать по возможности минималистичной.

define «минималистичной»?

Мне кажется, ты можешь использовать QSharedMemory без QCoreApplication

если же в твоем понимании минималистичности ты отказываешься линковаться с кусками куте, ну… лыжи, гамак и противогаз всегда в твоем распоряжении ))

Насколько я понимаю

я бы фокус с собственного понимания сместил на чтение доков для начала. Тролли вечно придумывают всякую машинерию, про неё нужно читать вдумчиво…

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