c - GCC Red Hat 4.8.5-39 上的 SEM_FAILED - 信号量
问题描述
这是我尝试编写的简单共享内存程序:
#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 (红帽 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
。
从shm_open()
文档:
[EACCES] 共享内存对象存在并且oflag指定的权限被拒绝,或者共享内存对象不存在并且创建共享内存对象的权限被拒绝,或者指定了O_TRUNC并且写权限被拒绝。
推荐阅读
- python-3.x - Tkinter 中的电池状态和充电通知器
- c++ - 这是什么意思?
- google-kubernetes-engine - 运行负载均衡器同步例程的 GKE 负载均衡器控制器出错:获取 Ingress 的机密时出错:机密“”不存在
- javascript - [TypeError:null 不是对象(评估 '_reactNativePdfLib.default.getDocumentsDirectory')]
- javascript - 如何查看批量发货单号?
- java - 三个属性相加后如何获得新列表
- python-decorators - 装饰器功能未按预期工作
- javascript - 导出/导入 useState 更改实用程序功能?
- c# - 实现评论列表删除以删除所有回复,如何?
- celery - 在 Celery 5.0 中删除了对这种用法的支持。相反,您应该使用 `-A` 作为全局选项: celery -A celeryapp worker <...>