У меня есть две нити, которые должны использовать общую память.
Принцип работы такой:
1)создаётся структура в шаредной памяти, есть её пид
2)fork()
3) у одного процесса shmat() - получаю указательна неё
4) у второго аналогично
5) у структуры есть поле - указатель на некую область памяти, я хочу, чтоб она была видна из обоих нитей. В одной нити я делаю shmget, и вот указатель в той структуре настраиваю через shmat на эту область памяти
6) в другой нити имея структуру, и то есть указатель хочу получить доступ к этой области памяти, которую только что выделил, но получаю Segmentation Fault.Вопрос такой: как мне можно сделать такой доступ, какой я пытался сделать.
>У меня есть две нити, которые должны использовать общую память.
>Принцип работы такой:
>1)создаётся структура в шаредной памяти, есть её пидpid структуры в шаредной памяти ?????
>2)fork()
>3) у одного процесса shmat() - получаю указательна неё
>4) у второго аналогичноТезис: указатели получены разные. То бишь два процесса картируют
одну и ту же область общей памяти, каждый из них присваивает этой
области памяти свой собственный диапазон виртуальных адресов.>5) у структуры есть поле - указатель на некую область памяти, я
>хочу, чтоб она была видна из обоих нитей. В одной нити
>я делаю shmget, и вот указатель в той структуре настраиваю через
>shmat на эту область памяти
>6) в другой нити имея структуру, и то есть указатель хочу получить
>доступ к этой области памяти, которую только что выделил, но получаю
>Segmentation Fault.Чего и следовало ожидать. Указатель, действительный в адресном
пространстве одного процесса, недействителен в адресном пространстве
другого. Скажу больше: поскольку shmat() на вновь созданную структуру
выполнен только в одном из процессов, в другом возможности обратиться
к соответствующему блоку просто нет. Данный блок не спроецирован в
адресное пространство того процесса, в коем происходит обращение.>
>Вопрос такой: как мне можно сделать такой доступ, какой я
>пытался сделать.
>Честно: я не понял, в чём состояла цель столь странных манипуляций.
А потому внятно ответить на последний вопрос я не могу :)
>У меня есть две нити, которые должны использовать общую память.
если это действительно нити, то и создавайте их через pthread_create>Принцип работы такой:
>1)создаётся структура в шаредной памяти, есть её пид
видемо имеется в виду ключ..
>2)fork()
>3) у одного процесса shmat() - получаю указательна неё
>4) у второго аналогично
>5) у структуры есть поле - указатель на некую область памяти, я
что за некая область памяти ? Если это поле упомянутой структуры,
то помещаете смещение поля, а не абсолютный адрес...если это еще одна shared mem., то укажите ее ключ..
>хочу, чтоб она была видна из обоих нитей. В одной нити
>я делаю shmget, и вот указатель в той структуре настраиваю через
>shmat на эту область памяти
>6) в другой нити имея структуру, и то есть указатель хочу получить
>доступ к этой области памяти, которую только что выделил, но получаю
>Segmentation Fault.
>
>Вопрос такой: как мне можно сделать такой доступ, какой я пытался сделать.
1) использовать нити (то есть одну большую память)и не заморачиваться с разделением памяти между задачами..
2) точнее формулировать вопросы