SEM_FAILED в G CC Red Hat 4.8.5-39 - Семафоры - PullRequest
0 голосов
/ 11 января 2020

Это простая программа с общей памятью, которую я пытался написать:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/mman.h>
#include <getopt.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <semaphore.h>
#include <fcntl.h>

#define SHM_NAME "/my_shm"
#define SEM_1 "/sem_1"
#define SEM_2 "/sem_2"
#define SEM_3 "/sem_3"
#define BUFFER_SIZE 10

typedef struct {
    int pred[8];
    int succ[8];
} fb_set;

struct sharedMemory{
    int rPos;
    int wPos;
    fb_set storage[BUFFER_SIZE];
    int done;
};

static struct sharedMemory *shared;

int main(int argc, char *argv[])
{
    int shmfd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0600);
    if (shmfd == -1){
       // exit
    }

    if (ftruncate(shmfd, sizeof(struct sharedMemory)) == -1){
        // exit
    }

    shared = mmap(NULL, sizeof(*shared), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
    if (shared == MAP_FAILED){
       // close resources
    }

    sem_t *sem_read = sem_open(SEM_1, O_CREAT | O_EXCL, 0600, 0);
    sem_t *sem_write = sem_open(SEM_2, O_CREAT | O_EXCL, 0600, BUFFER_SIZE);
    sem_t *sem_mutex = sem_open(SEM_3, O_CREAT | O_EXCL, 0600, 1);

    if (sem_read == SEM_FAILED){
        // close resources
    }
    if (sem_write == SEM_FAILED){
        // close resources
    }
    if(sem_mutex == SEM_FAILED){
        // close resources
    }
}

Все семафоры открыты правильно и программа компилируется с:

g cc (Ubuntu 7.4 .0-1ubuntu1 ~ 18.04.1) 7.4.0

Но когда я его примеряю:

g cc (G CC) 4.8.5 20150623 (Red Hat 4.8.5-39)

Я получаю SEM_FAILED на sem_t *sem_read = sem_open(SEM_1, O_CREAT | O_EXCL, 0600, 0);, а errno установлен на Permission denied.

Вот мой Makefile:

CC = gcc 
DEFS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_SOURCE=200809L
CFLAGS = -std=c99 -pedantic -Wall -g $(DEFS)
supervisor: supervisor.o
    $(CC) $(CFLAGS) -o $@ $^ -lrt -pthread
supervisor.o : supervisor.c
    $(CC) $(CFLAGS) -c -o $@ $<
clean:
    rm -rf *.o supervisor

Может кто-нибудь объяснить мне, что я сделал не так?

1 Ответ

0 голосов
/ 11 января 2020

errno установлено на Permission denied.

Из shm_open() документации :

[EACCES] Объект общей памяти существует, и разрешения, указанные в oflag, отклонены, или объект общей памяти не существует, и разрешение на создание объекта общей памяти отклонено, или указано O_TRUN C, и разрешение на запись отклонено .

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