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

用于多个客户端的posix共享内存

潘坚白
2023-03-14

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

enum { MAX_MSG = 256 };
enum { CLIENT_SEM,          // semaphore is 1 if server is available for use by client    
       MSG_FOR_DAEMON_SEM,  // semaphore is 1 if shm contains msg for daemon    
       MSG_FOR_CLIENT_SEM,  // semaphore is 1 if shm contains msg for client    
       MSG_FOR_SERVER_SEM,  // semaphore is 1 if shm contains msg for server    
       N_SEMS };

typedef struct {    
    sem_t  sems[N_SEMS]; // semaphore sent for sync   
    pid_t  clientPid;    // pid of current client    
    char   msg[MAX_MSG]; // current message being sent    
    int    max_matrix_size; //max rows a square matrix can have 
}Comm;

// server calls setup_comm with doCreate=1 and creates shared mem of size max_clients * sizeof(Comm) 
// client calls setup_comm with doCreate=0 and in return gets the mmap pointer to the shared memory created by the server 
Comm* setup_comm(const char *shmPosixName, int doCreate, int max_clients);

共有1个答案

严宇
2023-03-14

如果您使用一个Comm实例,那么服务器和所有客户机将共享一个结构来进行所有通信。这意味着sem_wait/sem_post围绕所有访问,同时洗牌clientPid和其余的struct变量以匹配当前活动的客户机。

分配结构数组似乎更简单,服务器操作整个结构范围,而每个子元素只能访问数组元素中的一个(当然,它可以看到所有这些元素,但只处理一个)。然后,每个Comm元素的每一组信号量将用于协调服务器和特定客户机之间的通信。这里的假设是客户之间没有通信

 类似资料:
  • 我在Linux上使用C。我需要构建使用共享内存和信号量进行通信的两个程序。 其中一个程序必须充当服务器(一次只能充当一个),另一个程序必须充当客户机(一次任意数量)。通信应遵循以下模式: 我知道如何在两个进程之间使用共享内存和信号量,但我不知道如何在数量不明的进程之间进行通信时使用它们。我考虑为每个客户机使用共享内存块,但我必须交换密钥并通知服务器新的客户机。所以这并不能解决问题。

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

  • 我的项目是在服务器上读取一个图像,进行一些处理,然后将整个图像传递给客户端。客户端接收图像并进行更多处理,然后将一些输出值返回给服务器。服务器和客户端之间使用的映像大小为[640x480x3]。 以下是我想到的实现这个问题的各种技术: 通过消息将整个像素值从服务器传递到客户端 在SO中有各种各样的答案。我目前正在努力让它工作。 服务器和客户端之间的这种消息传递模式是否可能?如果是,请提供一些文档参

  • 对于一个有多个feign客户端连接到同一个外部组件的应用程序,我们需要一个共享的断路器。 详细解释: 当提供服务关闭时,所有3个客户端都应该停止发送。因为所有请求都应该失败。是否可能所有3个客户共用同一个断路器?

  • 问题内容: RMI是否自己处理多个客户端?即 是否可以同时使用多个客户端的服务器功能? 如果没有,我该怎么做? 如果是,它如何工作?每次 调用 都会创建一个新线程吗?如果一个客户端阻止了该功能,那么下一个客户端会发生什么?等等 问题答案: 是 这个怎么运作?每次调用都会创建一个新线程吗?如果一个客户端阻止了该功能,那么下一个客户端会发生什么?等等 它为每个客户端连接创建一个线程。 如果一个客户端调