【发布时间】:2017-12-29 13:13:12
【问题描述】:
我正在实现一个带有客户端程序的服务器。通信使用共享内存。为了控制对公共资源的访问,我使用了信号量。如果客户端是服务器的新手,服务器会为客户端生成一个 id。客户端保存它的 id 并将在进一步的请求中发送这个 id。 我正在使用以下代码在服务器和客户端之间进行通信。此解决方案仅适用于一台服务器和一台客户端。
服务器:
#include <semaphore.h>
sem_t* server = sem_open(SEM_1, O_CREAT | O_EXCL, 0600, 1);
sem_t* client = sem_open(SEM_2, O_CREAT | O_EXCL, 0600, 0);
//other stuff
while (!want_quit)
{
sem_wait(client)
//get id of client from shared memory or generate id for client
//get the command from the client via shared memory
//process command
//write result back to shared memory
sem_post(server)
}
客户:
#include <semaphore.h>
sem_t* s1 = sem_open(SEM_1, 0);
sem_t* s2 = sem_open(SEM_2, 0);
do
{
//wait for the server
sem_wait(s1);
//get result from last command from shared memory
//send new request to server by writing command into shared memory
sem_post(s2);
} while (command from shm != CLOSE);
服务器应该工作/管理一个以上的客户端。我以为我可以通过第三个信号量来解决这个问题,但是我遇到了死锁问题,或者客户端处理了另一个客户端的结果。
我使用第三个信号量的解决方案如下所示:
服务器:
sem_wait(clients);
sem_wait(client);
sem_post(server);
客户:
sem_wait(s1);
sem_post(clients);
sem_post(server);
我该如何解决这个挑战?
【问题讨论】: