问题:如何使用 SysV 信号量在两个进程之间进行同步(我们称它们为procA
and procB
),假设两者都是从 shell 独立运行的(它们都不是由fork
/exec
组合产生的)并且信号量必须由其中之一创建这两个过程。
报价man semget
:
新创建的集合中的信号量的值是不确定的。(POSIX.1-2001 在这一点上是明确的。)尽管 Linux 和许多其他实现一样,将信号量值初始化为 0,但可移植应用程序不能依赖于此:它应该显式地将信号量初始化为所需的值。
假设我们想编写只依赖于 POSIX 保证而不依赖于 Linux 特定保证的可移植代码。很好,因此不可能原子地创建信号量集并对其进行初始化。这必须通过两个单独的调用来完成。
因此,用于创建信号量集的代码procA
将如下所示:
int sem_id = semget(key, nsems, IPC_CREAT | S_IRWXU);
同样的procB
——这样,无论哪个进程碰巧第一次需要信号量,它也会创建它们;否则,它只是获取信号量集的 ID 并准备使用它。
当需要初始化时,问题开始出现。初始化指令当然semctl
是SETALL
——但是: • 初始化应该只进行一次,并且 • 初始化应该在使用信号量之前完成。这当然可以通过……信号量来强制执行,但不幸的是这样的解决方案是递归的:我们需要信号量来设置信号量,而信号量本身也需要设置信号量等等。
是否可以仅使用 sysV 信号量来做到这一点,或者我是否正确地假设我必须求助于其他 IPC 设施,如信号或消息队列才能可靠地设置这些信号量?