C 谁初始化信号量?

C 谁初始化信号量?,c,posix,C,Posix,所以,问题是:我正在为我的大学项目编写一个“聊天模拟器”。由于不涉及太多细节,客户机可以多次运行,所有实例都使用由信号量保护的同一段共享内存(除其他外) 客户端在未知时间进入和退出系统。当第一个客户端进入系统时,它应该创建一个信号量,使用共享内存并释放。但是,如果任何其他客户端进入系统,它必须在获取共享内存访问之前等待信号量 现在,我觉得我遗漏了一些明显的东西——如何初始化信号量?如果我使用semget(42,1,IPC_create),生成的信号量很可能是0-但我无法将其提升以初始化它,因为0

所以,问题是:我正在为我的大学项目编写一个“聊天模拟器”。由于不涉及太多细节,客户机可以多次运行,所有实例都使用由信号量保护的同一段共享内存(除其他外)

客户端在未知时间进入和退出系统。当第一个客户端进入系统时,它应该创建一个信号量,使用共享内存并释放。但是,如果任何其他客户端进入系统,它必须在获取共享内存访问之前等待信号量

现在,我觉得我遗漏了一些明显的东西——如何初始化信号量?如果我使用
semget(42,1,IPC_create)
,生成的信号量很可能是0-但我无法将其提升以初始化它,因为0可能意味着关键部分中已经有一个进程。换句话说,我不知道是刚刚创建了默认值为0的信号量,还是有一个进程在等待该信号量

在伪代码中:

if(semaphore_not_exists(42))
{
    create_sem;
    raise_sem;
}
else
{
    get_sem_handle;
}
wait_on_sem;
critical_section;
release_sem;

那么,如何确保信号量尚未由另一个进程创建,以便安全地初始化它?如果我使用
IPC_EXCL
,请求将失败,但我不知道下一步该怎么做。

我认为信号量的所有用户都需要获得已经初始化的信号量。否则,信号量本身的初始化取决于竞争条件。 您可以有一个守护进程,它在系统引导时初始化信号量,并负责

create_sem;
raise_sem;
而客户端只是执行

get_sem_handle;

您可以执行以下操作:

  • 调用
    semget(键、nsems、IPC_创建| IPC_排除)
    。如果成功,您现在已经创建了一个新的信号量集,然后应该通过
    semctl()
  • 如果先前的
    semget()
    失败,请再次调用
    semget()
    ,而不使用
    IPC\u EXCL
    标志

  • 我还建议使用锁文件(通过
    flock()
    或类似工具)来确保信号量集在初始化之前不被使用。

    我认为信号量的所有用户都需要获得已经初始化的信号量。否则,信号量本身的初始化会受到竞争条件的影响。出于某种原因,您需要使用SysV信号量吗?这是我在课程中学习的内容,但我想替代方法不会有问题。为什么,它们过时了吗?是更现代、设计更好的API。但是,我不清楚它们是否有相同的问题。所以,唯一的选择是使用一个完全独立的进程来初始化信号量?每次启动客户机之前,我都必须运行它(因为我不能在uni计算机上修改init脚本)?嗯,希望有更优雅的。。。