как инициализировать безымянный семафор с разделяемой памятью? - PullRequest
1 голос
/ 06 мая 2020

Я знаю, что безымянные семафоры должны находиться в области разделяемой памяти, но я не знаю, как их реализовать, потому что mmap () возвращает указатель на отображаемую область, и я обязан использовать указатель sem_t, но на этот раз я думаю, что это не совсем безопасно. Вот что я сделал,

    sem_t *sem;
    char* name = "sharedSem";
    int fd;

    sem_init(sem, 1, 1);

    fd = shm_open(name, O_CREAT | O_RDWR, 0666);
    if(fd == -1)
    {
        perror("fail");
        exit(-1);
    }
    ftruncate(fd, sizeof(sem_t));
    sem = (sem_t*) mmap(0, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

Когда я использую указатель, я также не могу прочитать значение семафора, я даже не знаю, возможно ли это ..

Могу ли я создать безымянный семафор без указателя sem_t в области разделяемой памяти, к которой дочерние процессы также могут получить доступ?

1 Ответ

1 голос
/ 08 мая 2020

Проблема в том, что вы звоните sem_init, а sem все еще не указывает ни на что конкретное. Переместите этот вызов на после того, как вы наведете его на результат mmap (т. Е. В конец опубликованного вами фрагмента).

...