【发布时间】: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