所以,问题是:我正在为我的大学项目编写一个“聊天模拟器”。 不深入细节,客户端可以多次运行,所有实例都使用由信号量(以及其他内容)保护的相同的共享内存段。
客户端在未知的时间进入和退出系统。当第一个客户端进入系统时,它应该创建一个信号量,使用共享内存并释放。但是,如果有任何其他客户端进入系统,则必须在获取共享内存访问之前等待信号量。
现在,我觉得我忽略了一些明显的东西——如何初始化信号量? 如果我使用
伪代码如下:
那么,我该如何确保信号量还没有被其他进程创建,以便安全地初始化它?如果我使用
客户端在未知的时间进入和退出系统。当第一个客户端进入系统时,它应该创建一个信号量,使用共享内存并释放。但是,如果有任何其他客户端进入系统,则必须在获取共享内存访问之前等待信号量。
现在,我觉得我忽略了一些明显的东西——如何初始化信号量? 如果我使用
semget(42, 1, IPC_CREAT)
,那么结果信号量很可能是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
,请求将失败,但我不知道接下来应该怎么做。