【问题标题】:posix shared memory for multiple clients多个客户端的posix共享内存
【发布时间】:2013-11-23 10:50:34
【问题描述】:

我正在使用 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);

问题是,要处理多个客户端,是否需要维护一个Comm结构的数组;那是 Comm[max_clients] 而不是我目前使用的(单个 Comm 结构)?对于每个客户端,服务器需要管理 Comm 数组并将该数组中合适的元素返回给客户端。反过来,客户端将使用该块来同步 Comm 元素内信号量上的操作?还是可以用一个 Comm 结构来处理多个客户端?

【问题讨论】:

    标签: c posix semaphore memory-mapping


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2023-03-03
      • 2020-10-18
      • 2011-04-01
      • 2015-10-10
      相关资源
      最近更新 更多