当前位置: 首页 > 知识库问答 >
问题:

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

卢黎昕
2023-03-14

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

其中一个程序必须充当服务器(一次只能充当一个),另一个程序必须充当客户机(一次任意数量)。通信应遵循以下模式:

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

我知道如何在两个进程之间使用共享内存和信号量,但我不知道如何在数量不明的进程之间进行通信时使用它们。我考虑为每个客户机使用共享内存块,但我必须交换密钥并通知服务器新的客户机。所以这并不能解决问题。

共有1个答案

弘伟彦
2023-03-14

如果您希望对所有客户机只使用一个共享内存块,这意味着在任何给定的时间,只有一个客户机可以与服务器通信,这可能是一个性能/安全问题。如果一个客户机抓取信号量并不释放它怎么办。

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

此解决方案是您所能使用的最低限度的解决方案。它会受到我上面提到的问题的困扰,还会导致客户端旋转(浪费cpu)、不公平、饥饿等。

 类似资料:
  • 我必须为C语言课程编写一个小游戏,它必须使用共享内存、信号量和一个可以处理多个客户机的客户机/服务器体系结构(游戏的确切要求是2)。 这两个客户机需要轮流执行,它们由完全相同的程序表示(这里没有涉及fork()--都以./client开头) 服务器必须在启动时创建所有资源。所以我的主要问题是关于信号量。(共享内存和游戏逻辑可以工作,或者并不难实现。) 为了决定服务器或客户机是否可以访问共享内存,我

  • 我正在使用POSIX共享内存和未命名信号量实现客户机服务器。服务器可以同时处理多个客户端。该代码适用于单个客户端,但不适用于多个客户端。POSIX操作是用,

  • 我想创建一个共享内存和信号量的C程序。应该有两个子进程。两个孩子都有一个不同的int数。然后有一个目标号码,应该写在共享内存中。现在两个孩子都应该从进球数中减去他们的数字,直到进球数低于或等于0。我不希望出现比赛条件。这就是为什么我尝试使用信号量。但对我没用。下面是我的代码:

  • 我需要编写一个程序,它正在创建N个数量的子进程,每一个进程都将一个添加到共享内存变量中。我的想法是使用信号量和共享内存,但进程之间并没有相互等待,共享内存变量也没有像我希望的那样工作。 MyDefs.H Main.C 奴隶Proc.c

  • 我尝试编写一个共享内存和信号量程序,该程序一直运行到按下Ctrl+C,即接收到: 当按下Ctrl+C时,被设置为,它会跳出循环并退出。在没有共享内存和信号量的情况下,这可以很好地工作,但是在这里,我从来没有在上获得字符串,只捕获并且它继续运行。 为什么?