如何只初始化一次信号量?

How to initialize semaphore only once?

我目前正在做的事情需要在一个函数内初始化几个 posix 信号量,多个进程将是 运行,并且信号量将与另一个函数共享,其中这些进程也将是 运行。我该怎么做才能让信号量只由一个线程创建一次,而其他线程只打开它们?我似乎无法在任何地方找到有关如何执行此操作的任何信息。

关于这个主题,我能找到的只是关于如何使用 sem_wait() 和 sem_post() 函数的信息,但没有针对我的问题的具体信息。我还必须确保文件仅创建一次并由其他进程打开,但可以检查该文件是否已由 access() 函数创建。信号量有类似的东西吗?

如能帮助解释这是如何完成的,我们将不胜感激。

the file can be checked whether or not it's been created already by the access() function

看来只能这么查了。实际上这是行不通的。

在您通过调用 access() 确认文件不存在之后,在您尝试自己创建文件之前,可以创建另一个执行线程。这称为 竞争条件

这就是为什么在 open sem_open 系统调用中使用 O_EXCL | O_CREAT 标志的原因。此操作是 atomic:它验证 file/semaphore 不存在,并在一个不可分割的操作中创建一个新的。如果操作 returns 失败并且 errno 设置为 EEXIST,则 file/semaphore 已经存在。

这自然只适用于命名信号量(您使用 sem_open 创建的信号量)。应在启动使用它的线程之前创建未命名的信号量(您使用 sem_init 创建的信号量),或者应通过其他方式同步其创建。