Как использовать shmat с не равным NULL выравниванием страницы shmaddr? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать разделяемую память с адресом переменных, созданных в куче, я обеспечил выравнивание адреса по странице, но все равно получаю ошибку: «Неверный аргумент».Как я мог правильно сделать это?

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <cstdint>
const int PERMISSION = 0666; //-rw-rw-rw-

int main() {
    int size = 10;
    void* testp = std::aligned_alloc(SHMLBA, size);
    int shkey = 314159, shmid;
    if ((shmid = shmget(shkey, size, IPC_CREAT | PERMISSION)) == -1) {
        perror("shmget: shmget failed");
        exit(-1);
    }
    void *ret;
    if ((ret = shmat(shmid, testp, 0)) == (void*)-1) {
        perror("shmat: shmat failed");
        exit(-1);
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Похоже, что вы должны передать SHM_REMAP при вызове shmat с аргументом, отличным от NULL:

shmat (shmid, testp, SHM_REMAP);

Не сразу понятно, почему это должно быть.Согласно документации , этот флаг специфичен для Linux.

Демонстрационная версия

0 голосов
/ 24 апреля 2019

C ++ 17 стандарт говорит, как отмечено здесь ,

Передача size, который не является целым кратным выравнивания или выравнивания, которое недопустимо или нетподдерживаемый реализацией приводит к сбою функции и возвращению нулевого указателя (C11, как опубликовано, в этом случае указывает неопределенное поведение, это было исправлено DR 460).

Так что же такое SHMLBA?Это должен быть интеграл, который, как говорится, является фактором выравнивания.

...