避免使用C中的fork()进行变量复制

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()之外使用静态或声明全局变量,但据我所知,它没有任何效果.

Bas*_*tch 5

fork不会复制变量,而是复制调用过程整个地址空间(通过定义fork).

您可能想要使用一些共享内存,但是您应该关心同步.读取shm_overview(7)sem_overview(7)(你可以使用mmap(2)共享一些内存但无论如何都需要同步).

也许你不需要fork,但你只想让几个线程共享相同的地址空间.阅读pthreads(7)和一个很好的pthread教程.那么你也应该关心同步,可能是使用互斥锁.

您也可以(而且)使用其他形式的IPC.阅读高级Linux编程,考虑使用pipe(7) -s并在多路复用系统调用(如poll)之间进行一些事件循环

在服务器/客户端方案中,您可能有一些请求和协议(从客户端内部)查询某些状态变量(在服务器内).

PS.主要问题是不共享数据,它是同步和避免死锁.

  • 对不起,您需要几个小时的阅读和实验.我只是不能做出一个快速的例子.*同步*(和*死锁避免*)是重要问题. (3认同)