Это простая программа с общей памятью, которую я пытался написать:
#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
Может кто-нибудь объяснить мне, что я сделал не так?