wir*_*ark 0 c sockets multithreading fork shared-memory
我正在实现一个服务于多个客户端的服务器,我需要一些服务器的变量在共享内存中,以便客户端实际看到另一个客户端最终编辑的内容.
我试着环顾四周,但我不明白是否有任何方法可以通过使用fork()实现这一点,或者我完全需要改变我处理客户端的方式.特别是我不知道我是否应该实现管道进程或线程.另外,更简单的方法是什么?
这是我在main中声明int var之后的代码:
while(1) {
printf("Waiting connection...\n");
if ((connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0) {
perror("Accept Error");
exit(1);
}
if ((pid = fork()) == 0) {
close (listenfd);
printf("Variable: %d\n", var); // var = 0
var = 1;
printf("Variable: %d\n", var); // var = 1
exit(0);
}
close(connfd);
}
Run Code Online (Sandbox Code Playgroud)
当我与另一个客户端连接时,我再次看到var = 0,因为子进程生成了父进程的副本.
尝试在main()之外使用静态或声明全局变量,但据我所知,它没有任何效果.
fork不会复制变量,而是复制调用过程的整个地址空间(通过定义fork).
您可能想要使用一些共享内存,但是您应该关心同步.读取shm_overview(7)和sem_overview(7)(你可以使用mmap(2)共享一些内存但无论如何都需要同步).
也许你不需要fork,但你只想让几个线程共享相同的地址空间.阅读pthreads(7)和一个很好的pthread教程.那么你也应该关心同步,可能是使用互斥锁.
您也可以(而且)使用其他形式的IPC.阅读高级Linux编程,考虑使用pipe(7) -s并在多路复用系统调用(如poll)之间进行一些事件循环
在服务器/客户端方案中,您可能有一些请求和协议(从客户端内部)查询某些状态变量(在服务器内).
PS.主要问题是不共享数据,它是同步和避免死锁.