在准备好之前如何阻止共享内存访问?

How do you block shared memory access until it is ready?

我正在尝试在多个进程之间共享一个互斥量。每个进程将在某个随机时间开始 运行ning,因此我需要每个进程都能够设置共享内存并准备好互斥量以供使用。到目前为止效果很好:

int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR);
if (fd < 0) {
    fd = shm_open(name, O_RDWR, S_IRUSR);
} else {
    //**critical section**

    // set up the mutex inside the shared memory
    // update permissions so other processes can access the shared memory
    fchmod(fd, S_IRUSR | S_IWUSR)

    //**critical section**
}

// mmap() shared memory
// pthread_mutex_lock()
// some other critical section
// pthread mutex unlock()

但是如果我在 else 块的开头添加一个 sleep() 来模拟共享内存的缓慢创建,我 运行 会遇到另一个进程将看到创建的文件并尝试使用的问题马上,在它准备好之前。

在共享内存准备好之前,有什么方法可以阻止 shm_open() 调用吗?就像告诉它等到它有足够的权限打开文件(我的关键部分的最后一步)。或者有什么方法可以在创建文件时立即锁定文件,以便其他进程必须等待它被设置和解锁,flock()?

我实际上已经在这里解决了我自己的问题,有人有任何改进建议吗?

解决方案:

int lock_fd shm_open(setup_control, O_RDWR | O_CREAT, S_IRUSR, S_IWUSR);
flock(lock_fd, LOCK_EX);

int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR, S_IWUSR);
if (fd < 0) {
    fd = shm_open(name, O_RDWR, S_IRUSR);
} else {
    //**critical section**

    // set up the mutex inside the shared memory

    //**critical section**
}
flock(lock_fd, LOCK_UN);

// mmap() shared memory
// pthread_mutex_lock()
// some other critical section
// pthread mutex unlock()

基本上,锁定文件确保只有 1 个进程可以同时获取或设置互斥量,这意味着在 [下一个] 进程打开它已经完成设置的互斥量文件时