使用共享内存和信号量与多个客户端

时间:2014-05-28 14:53:29

标签: c client-server semaphore shared-memory

我在Linux上使用C语言。我需要构建两个使用共享内存和信号量进行通信的程序。

其中一个程序必须作为服务器(一次只能一个),另一个作为客户端(一次任意数字)。沟通应该遵循这种模式:

 Client1 -> Server (Client1 writes to ShM, Server reads it)  
 Client1 <- Server  
 Client2 -> Server  
 Client2 <- Server  

我知道如何在两个进程之间使用共享内存和信号量,但如果未定义数量的进程想要通信,我就不知道如何使用它们。 我想为每个客户端使用共享内存块,但我必须交换密钥并通知服务器新客户端。所以这并没有解决问题。

1 个答案:

答案 0 :(得分:0)

如果您想在任何给定时间仅为所有客户端使用单个共享内存块,则只有一个客户端可以与服务器通信,这可能是性能/安全问题。如果一个客户端获取信号量并且从不释放它,该怎么办?

如果所有客户都信任并且性能不是问题,那么您的客户需要获取信号量,如果他们不能,他们可以阻止或旋转信号量。假设您将信号量初始化为1,然后每个客户端将使用类似test_and_set()的方式尝试原子down()。如果test_and_set()返回1,则表示操作成功,客户端可以与服务器通信。如果失败,则客户端可以旋转该值,直到它再次变为1,然后再次尝试。

此解决方案是您可以使用的最低限度。它受到我上面提到的问题的困扰,也导致客户旋转(浪费cpu),不保证公平,饥饿等。你可能最好使用你可以实际入睡的互斥量。