我知道未命名的semaphores应该在共享内存区域,但我不知道如何实现,因为mmap()返回一个指向映射区域的指针,我必须使用sem_t指针,但这次,我认为这并不安全。我是这样做的。
sem_t *sem;
char* name = "sharedSem";
int fd;
sem_init(sem, 1, 1);
fd = shm_open(name, O_CREAT | O_RDWR, 0666);
if(fd == -1)
{
perror("fail");
exit(-1);
}
ftruncate(fd, sizeof(sem_t));
sem = (sem_t*) mmap(0, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
当我使用指针时,我也不能读取semaphore的值,我甚至不知道这是否可能。
我可以在共享内存区域创建一个没有sem_t指针的无名旗语,让子进程也可以访问吗?
问题是你在调用 sem_init
而 sem
仍然没有指向任何特定的地方。把这个调用移到你把它指向了 mmap
(即到你发布的片段底部)。