如何解决使用 Forks 和 Sockets C++ 的晚餐哲学家
所以我在那个堆栈的帮助下做了一个 Fork Dinner Philosophers: Dining Philosophers in C using fork()
运行正常,
然后我更改它,用叉子在客户端设置我的哲学家,然后将其发送到服务器,这是晚餐,然后我将消息发送回客户端进行打印。一切都在运行,但是只有一个fork(fork 1)进入服务器,你们能帮我解决吗?
Client.cpp:
#include "cliente.hpp"
int main(void)
{
int filosofos = socket_Create_and_Conect();
if (filosofos == -1){
return 0;
}
int i;
pid_t pid,pids[N]; // process ids
for(i=0;i<N;++i)
{
pid = fork();
if(pid==0)
{
// child
send(filosofos,&i,sizeof(i),0);
_exit(0);
}
else if(pid>0)
{
// parent
pids[i] = pid;
//printf("pids[%d]=%d\n",i,pids[i]);
}
else
{
perror("fork");
_exit(0);
}
}
for(i=0;i<N;++i)
waitpid(pids[i],NULL,0);
while(1){
printStringSocket(filosofos);
}
return 0;
}
server.cpp:
#include "servidor.hpp"
struct shared_data *shared;
string mensagem;
int new_socket;
int main(void)
{
string msg;
int server_fd,buffer;
initialize_shared();
socket_Create_and_Conect(server_fd,new_socket);
read(new_socket,&buffer,sizeof(buffer));
philosopher(buffer);
finalize_shared();
return 0;
}
void socket_Create_and_Conect(int &server_fd,int &new_socket){
//STUFF
}
void philosopher(int i)
{
while(1)
{
sleep(1);
take_spoon(i);
sleep(2);
put_spoon(i);
sleep(1);
}
}
void take_spoon(int i)
{
sem_wait(&shared->spoon);
shared->state[i] = HUNGRY;
mensagem = "Filosofo " + std::to_string(i+1) + " tem fome.";
sendString(mensagem);
test(i);
sem_post(&shared->spoon);
sem_wait(&shared->phil[i]);
}
void put_spoon(int i)
{
sem_wait(&shared->spoon);
shared->state[i] = THINKING;
mensagem = "Filosofo " + std::to_string(i+1) + " largou a colher " + std::to_string(LEFT+1) + " e " + std::to_string(i+1) + ".";
sendString(mensagem);
mensagem = "Filosofo " + std::to_string(i+1) + " está pensando.";
sendString(mensagem);
test(LEFT);
test(RIGHT);
sem_post(&shared->spoon);
}
void test(int i)
{
if( shared->state[i] == HUNGRY && shared->state[LEFT] != EATING && shared->state[RIGHT] != EATING)
{
shared->state[i] = EATING;
mensagem = "Filosofo " + std::to_string(i+1) + " pegou a colher " + std::to_string(LEFT+1) + " e " + std::to_string(i+1) + ".";
sendString(mensagem);
mensagem = "Filosofo " + std::to_string(i+1) + " está comendo.";
sendString(mensagem);
sem_post(&shared->phil[i]);
}
}
void initialize_shared()
{
int i;
int prot=(PROT_READ|PROT_WRITE);
int flags=(MAP_SHARED|MAP_ANONYMOUS);
shared= static_cast<shared_data*>(mmap(0,sizeof(*shared),prot,flags,-1,0));
memset(shared,'\0',sizeof(*shared));
sem_init(&shared->spoon,1,1);
for(i=0;i<N;++i) sem_init(&shared->phil[i],1);
}
void finalize_shared()
{
int i;
for(i=0;i<N;++i) sem_destroy(&shared->phil[i]);
munmap(shared,sizeof(*shared));
}
我猜这与信号量有关?
我可能需要在客户端创建它们,然后通过套接字将其传递给服务器?
如果是这样,我如何更改服务器上的数据并将其发送回客户端以设置其他 Forks?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。