Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: ammaximus от Октябрь 03, 2014, 15:39



Название: QSharedMemory native key
Отправлено: 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;
}

В этом коде я пытаюсь подключится к указанному нативному ключу, но вместо этого генерируется другой. Что я делаю не так?
(http://MMFFail.png)
shmget(key) с этим ключом работает верно. Qt4.8.5


Название: Re: QSharedMemory native key
Отправлено: Old от Октябрь 03, 2014, 16:47
Вы определитесь, этот процесс создаёт память (create) или подключается к уже созданной (attach).


Название: Re: QSharedMemory native key
Отправлено: ammaximus от Октябрь 06, 2014, 07:54
Задача в том, что если память еще не создана ее нужно создать. Я планирую сделать if (!create) attach. Но это не имеет отношения к проблеме я пробовал и так и так.

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

ЧЯДНТ? Есть вообще какие-либо рабочие примеры использования setNativeKey?


Название: Re: QSharedMemory native key
Отправлено: Old от Октябрь 06, 2014, 08:33
А как вы формируете ключ в программе без Qt? Точнее что указываете для параметра proj_id функции ftok?
Qt пикает туда 'Q'.

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

тогда они будут совпадать.


Название: Re: QSharedMemory native key
Отправлено: ammaximus от Октябрь 06, 2014, 10:36
Спасибо!


Название: Re: QSharedMemory native key
Отправлено: ammaximus от Октябрь 06, 2014, 12:20
Вопрос по ftok. Я запустил эту функцию в qt приложении и получил ключ, совпадающий с тем что дала mem.setNativekey

ftok ("4589",'Q');
  Но когда я перенес функцию в проект без Qt он начал кидаться в меня enoent, как в принципе и должно бы ь поскольку 4589  не файл, но почему там то работает?


Название: Re: QSharedMemory native key
Отправлено: ammaximus от Октябрь 06, 2014, 12:22
И еще у меня в процессе ftok не использовался, сразу shmget. Можно что нибудь сделать чтобы не переписывать старый проект сильно (он shared library)


Название: Re: QSharedMemory native key
Отправлено: ammaximus от Октябрь 06, 2014, 12:42
Вопрос снят, креатор каким то боком создавал этот файл в папке билда


Название: Re: QSharedMemory native key
Отправлено: ammaximus от Октябрь 06, 2014, 14:21
Чтобы уж закрыть тему: с натив ключом я разобрался он ждет на вход аргумент фтока, а что с обычным ключом?  Что подавать на вход ему и что из этого получится? Я понял что изза нативкей перестает работать встроенный  сеемафор, а что если создавать через qt  и подцепаться к семафору вручную?