Russian Qt Forum
Ноябрь 22, 2024, 22:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSharedMemory native key  (Прочитано 5510 раз)
ammaximus
Гость
« : Октябрь 03, 2014, 15:39 »

Один процесс использует QSharedMemory, другой shmget. Для этого вроде и ввели setNativeKey в 4.8.
Код:
#include <QCoreApplication>
#include <QDebug>
#include <QSharedMemory>

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

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "Fall infinite, my PID=" << getpid();

    QSharedMemory mem;
    mem.setNativeKey("4589");

    qDebug() << "Ok, start, my nativeKey=" << mem.nativeKey() << " key=" << mem.key();
    if (!mem.create(7777))
        qDebug() << "Create fail:" << mem.errorString();
    else
        qDebug() << "Memory created successfully";
    if (mem.attach())
        qDebug() << "Attached succesfully";
    else
        qDebug() << "Attach fail:" << mem.errorString();

    qDebug() << "_______________________________";

    getchar();
    return 0;
}

В этом коде я пытаюсь подключится к указанному нативному ключу, но вместо этого генерируется другой. Что я делаю не так?

shmget(key) с этим ключом работает верно. Qt4.8.5
« Последнее редактирование: Октябрь 03, 2014, 15:41 от ammaximus » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 03, 2014, 16:47 »

Вы определитесь, этот процесс создаёт память (create) или подключается к уже созданной (attach).
Записан
ammaximus
Гость
« Ответ #2 : Октябрь 06, 2014, 07:54 »

Задача в том, что если память еще не создана ее нужно создать. Я планирую сделать if (!create) attach. Но это не имеет отношения к проблеме я пробовал и так и так.

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

ЧЯДНТ? Есть вообще какие-либо рабочие примеры использования setNativeKey?
« Последнее редактирование: Октябрь 06, 2014, 07:55 от ammaximus » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Октябрь 06, 2014, 08:33 »

А как вы формируете ключ в программе без Qt? Точнее что указываете для параметра proj_id функции ftok?
Qt пикает туда 'Q'.

Попробуйте формировать ключ в программе без Qt так:
Код
C++ (Qt)
key = ftok( "4589", 'Q' );
 

тогда они будут совпадать.
« Последнее редактирование: Октябрь 06, 2014, 08:37 от Old » Записан
ammaximus
Гость
« Ответ #4 : Октябрь 06, 2014, 10:36 »

Спасибо!
Записан
ammaximus
Гость
« Ответ #5 : Октябрь 06, 2014, 12:20 »

Вопрос по ftok. Я запустил эту функцию в qt приложении и получил ключ, совпадающий с тем что дала mem.setNativekey

ftok ("4589",'Q');
  Но когда я перенес функцию в проект без Qt он начал кидаться в меня enoent, как в принципе и должно бы ь поскольку 4589  не файл, но почему там то работает?
Записан
ammaximus
Гость
« Ответ #6 : Октябрь 06, 2014, 12:22 »

И еще у меня в процессе ftok не использовался, сразу shmget. Можно что нибудь сделать чтобы не переписывать старый проект сильно (он shared library)
Записан
ammaximus
Гость
« Ответ #7 : Октябрь 06, 2014, 12:42 »

Вопрос снят, креатор каким то боком создавал этот файл в папке билда
Записан
ammaximus
Гость
« Ответ #8 : Октябрь 06, 2014, 14:21 »

Чтобы уж закрыть тему: с натив ключом я разобрался он ждет на вход аргумент фтока, а что с обычным ключом?  Что подавать на вход ему и что из этого получится? Я понял что изза нативкей перестает работать встроенный  сеемафор, а что если создавать через qt  и подцепаться к семафору вручную?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.205 секунд. Запросов: 22.