GCC Red Hat 4.8.5-39上的SEM_FAILED-信号灯

问题描述 投票:0回答:1

这是我尝试编写的简单共享内存程序:

#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

有人可以向我解释我做错了什么吗?

c gcc semaphore shared-memory
1个回答
0
投票

[errno设置为Permission denied

© www.soinside.com 2019 - 2024. All rights reserved.