2017-04-04 70 views
0

什么我目前工作的要求夫妇POSIX信号到多个进程将运行在函数中被初始化,并且信号灯将与这些加工也将运行的另一个功能共享。我该如何解决这个问题,以便信号量只能由一个线程创建,而其余的只能打开它们?我似乎无法找到任何有关如何在任何地方做到这一点。如何只初始化信号灯一次?

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

在解释如何做到这一点,将不胜感激任何帮助。

+1

开始之前线程之外创建它们。 – Fredrik

回答

0

文件可以被检查是否它已经被访问()函数

它只会出现,它可以使检查已经创建。实际上这是行不通的。

在您通过调用access()并且在尝试自己创建它之前验证它不存在时,可以创建另一个执行线程的文件。这被称为竞赛条件

这就是为什么使用在opensem_open系统调用O_EXCL | O_CREAT标志。此操作原子:它验证文件/信号灯不存在,并创建一个新的,在一个不可分割的动作。如果操作返回失败并且errno设置为EEXIST,则文件/信号量已经存在。

这自然仅适用于命名信号(那些你sem_open创建)。应该在开始使用它的线程之前创建一个未命名的信号量(您创建的一个信号量为sem_init),或者使用其他方法同步其创建。