在C中使用fork()避免变量重复

在C中使用fork()避免变量重复,c,multithreading,sockets,fork,shared-memory,C,Multithreading,Sockets,Fork,Shared Memory,我正在实现一个服务于多个客户机的服务器,我需要一些服务器的变量在共享内存中,这样客户机才能真正看到另一个客户机最终编辑的内容 我试着四处看看,但我不明白是否有任何方法可以通过使用fork()实现这一点,或者我完全需要改变处理客户机的方式。特别是,我不知道是否应该实现管道进程或线程。还有,更简单的方法是什么 这是我在main中声明int var后的代码: while(1) { printf("Waiting connection...\n"); if ((connf

我正在实现一个服务于多个客户机的服务器,我需要一些服务器的变量在共享内存中,这样客户机才能真正看到另一个客户机最终编辑的内容

我试着四处看看,但我不明白是否有任何方法可以通过使用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);
    }
while(1){
printf(“等待连接…\n”);
如果((connfd=accept(listenfd,(struct sockaddr*)NULL,NULL))<0{
perror(“接受错误”);
出口(1);
}
如果((pid=fork())==0){
关闭(listenfd);
printf(“变量:%d\n”,var);//var=0
var=1;
printf(“变量:%d\n”,var);//var=1
出口(0);
}
关闭(connfd);
}
当我与另一个客户端连接时,我再次看到var=0,因为子进程生成父进程的副本


尝试在main()之外使用静态变量或声明全局变量,但据我所知,没有效果。

fork
不会复制变量,而是复制调用的整个变量(根据
fork

您可能想使用一些共享内存,但是您应该关心。读取和(您可以使用共享一些内存,但仍需要同步)

也许你不需要fork,但是你只想让几个线程共享同一个地址空间。读一本好书。然后您还应该关心同步,可能是使用互斥体

你也可以(相反地)使用其他形式的语言。阅读,考虑使用-S,并有一些围绕多路复用SysCurrar类似

在服务器/客户端场景中,您可能需要(从客户端内部)查询(服务器内部)某些状态变量的请求和协议


主要问题不是共享数据,而是同步和避免。

fork
不复制变量,而是复制调用的整个变量(根据
fork

您可能想使用一些共享内存,但是您应该关心。读取和(您可以使用共享一些内存,但仍需要同步)

也许你不需要fork,但是你只想让几个线程共享同一个地址空间。读一本好书。然后您还应该关心同步,可能是使用互斥体

你也可以(相反地)使用其他形式的语言。阅读,考虑使用-S,并有一些围绕多路复用SysCurrar类似

在服务器/客户端场景中,您可能需要(从客户端内部)查询(服务器内部)某些状态变量的请求和协议


PS.主要问题不是共享数据,而是同步和避免。

“我需要一些服务器变量在共享内存中”-这将是您尝试执行的操作的答案,因此不清楚问题是什么。进程之间的共享数据必须以某种方式“共享”,共享内存是一种常见的选择。在网上我发现了这一点,但我不知道我是否在寻找正确的东西,因为它谈论的是片段和类似的东西。这看起来是正确的。同时检查Basile答案中的链接。在这个站点和其他站点上搜寻足够多的信息,你可能会找到合理的例子来说明如何做到这一点。“我需要一些服务器的变量在共享内存中”-这将是你试图做的事情的答案,因此不清楚问题是什么。进程之间的共享数据必须以某种方式“共享”,共享内存是一种常见的选择。在网上我发现了这一点,但我不知道我是否在寻找正确的东西,因为它谈论的是片段和类似的东西。这看起来是正确的。同时检查Basile答案中的链接。在这个网站和其他网站上搜寻足够多的信息,你可能会找到合理的例子来说明如何做到这一点。是的,我知道这一点。事实上,我写了“生成父进程的副本”,无论如何,我不知道如何从您编写的函数开始,您能给我一个非常快速的示例,并演示如何在“共享”空间中“发送”变量吗?对不起,您需要几小时的阅读和实验。我只是不能做出一个快速的例子。同步(和避免死锁)是一个重要的问题。不过,请阅读更新后的答案,并查看教程,因为在这一点上,我并不认为我需要使用fork,而是创建几个线程。感谢您提供完整的答案,并支持
MAP\u SHARED
是另一个选项。可能需要不到几个小时的阅读时间。
select
几乎过时了。改为使用
poll
。是的,你可以把它和线一起使用。是的,我知道这一点。事实上,我写了“生成父进程的副本”,无论如何,我不知道如何从您编写的函数开始,您能给我一个非常快速的示例,并演示如何在“共享”空间中“发送”变量吗?对不起,您需要几小时的阅读和实验。我只是不能做出一个快速的例子。同步(和避免死锁)是一个重要的问题。不过,请阅读更新后的答案,并查看教程,因为在这一点上,我并不认为我需要使用fork,而是创建几个线程。感谢您提供完整的答案,并支持
MAP\u SHARED
是另一个选项。可能需要不到几个小时的阅读时间。
select
几乎过时了。改为使用
poll
。是的,你可以把它和线程一起使用。