читать из стандартного ввода в mmap - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть этот цикл, который читает из стандартного ввода в массив

int* arr;
arr = malloc(sizeof(int)*size);
for (i = 0; i < size; i++)
{
    read(0, &arr[i], 4);
}

Как я могу заставить его работать, если arr является указателем общей памяти arr=createSharedMemory(sizeof(int)*size)

int* createSharedMemory(size_t size) {
    int protection = PROT_READ | PROT_WRITE;
    int visibility = MAP_ANONYMOUS | MAP_SHARED;
    return (int*)mmap(0, size, protection, visibility, 0, 0);
}

в настоящее время это ошибки сегментации

1 Ответ

0 голосов
/ 10 декабря 2018

Проверьте ваш возврат от mmap().

Вы пытались mmap() stdin.За исключением экзотических сред, stdin - это своего рода терминал или канал, ни один из которых не поддерживает ввод-вывод в память.

Попробуйте следующий пример:

int* createSharedMemory(size_t size) {
    int protection = PROT_READ | PROT_WRITE;
    int visibility = MAP_ANONYMOUS | MAP_SHARED;
    int *p = (int*)mmap(0, size, protection, visibility, -1, 0);
    if (p == (int*)(ptrdiff_t)-1) return NULL;
    return p;
}

arr = createSharedMemory(sizeof(int)*size);
if (arr == NULL) {
    perror("mmap");
    exit(3);
}

Кстати, ваш цикл чтения взорвется, если sizeof(int) < 4 что маловероятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...