这是我尝试编写的简单共享内存程序:
#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
}
}
所有信号灯均已正确打开,程序使用以下命令编译:
gcc(Ubuntu 7.4.0-1ubuntu1〜18.04.1)7.4.0
但是当我尝试时:
gcc(GCC)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
有人可以向我解释我做错了什么吗?
[
errno
设置为Permission denied
。