shm_open () завершается ошибкой при повторном открытии с тем же именем, хотя O_CREAT используется снова - PullRequest
0 голосов
/ 21 января 2019

Согласно http://man7.org/linux/man-pages/man3/shm_open.3.html, говорится, что

 After a successful shm_unlink(), attempts to shm_open() an object with the same name fail (unless O_CREAT was
 specified, in which case a new, distinct object is created).

S, я попробовал это. Я использую приведенный ниже пример, который создает новый объект совместно используемой памяти после выполнения shm_unlink и, как они сказали, я использую O_CREAT.

Но когда я запускаю эту проблему, она дает мне сообщение об ошибке bus error.

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

int main(void) {
    // Open shared memory
    int fd = shm_open("TEST", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    ftruncate(fd, sizeof(int));

    // Map shared memory
    int *shm = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    close(fd);

    // Access shared memory
    *shm = 0;

    // Unmap shared memory
    munmap(shm, sizeof(int));

    if(shm_unlink("TEST")){
        printf("************success****************");
    }

    fd = shm_open("TEST", O_CREAT |O_RDWR, S_IRUSR | S_IWUSR);
    int *shm2 = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    *shm2 = 0;

    return 0;
}

Каков правильный процесс создания общей памяти с тем же именем снова после выполнения shm_unlink.

1 Ответ

0 голосов
/ 21 января 2019

Вы обращаетесь к неверной общей памяти во второй попытке (это должен быть shm2, а не shm) и не забудьте обрезать.

Также не актуально, но shm_unlink возвращает 0 в случае успеха.

#include <sys/mman.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(void) {
    // Open shared memory
    int fd = shm_open("TEST", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    ftruncate(fd, sizeof(int));

    // Map shared memory
    int *shm = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    close(fd);

    // Access shared memory
    *shm = 0;

    // Unmap shared memory
    munmap(shm, sizeof(int));

    if(!shm_unlink("TEST")){
        printf("************success****************");
    }

    fd = shm_open("TEST", O_CREAT |O_RDWR, S_IRUSR | S_IWUSR);
    int *shm2 = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
    ftruncate(fd, sizeof(int));
    *shm2 = 0;

    return 0;
}
...