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

Avoid variable duplication using fork() in C

我正在实现一个为多个客户端提供服务的服务器,我需要将一些服务器的变量放在共享内存中,以便客户端实际看到另一个客户端最终编辑的内容。

我试着环顾四周,但我不明白是否有任何方法可以通过使用 fork() 来实现这一点,或者我完全需要改变我处理客户的方式。特别是我不知道我是否应该实现管道进程或线程。还有,有什么比较简单的方法吗?

这是我在主体中声明 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);
    }

当我与另一个客户端连接时,我再次看到 var = 0,因为子进程生成父进程的副本。

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

fork 不重复 变量 整个 address space (by definition of fork) of the invoking process.

你可能想使用一些共享内存,但你应该关心 synchronization. Read shm_overview(7) and sem_overview(7) (you could share some memory using mmap(2) 但无论如何你都需要同步)。

也许你不需要分叉,但你只想让几个线程共享相同地址space.阅读pthreads(7) and a good pthread tutorial。然后你还应该关心同步,可能使用互斥体。

您也可以(改为)使用其他形式的 IPC. Read Advanced Linux Programming, consider using pipe(7)-s and have some event loop around a multiplexing syscall like poll(2)

在 server/client 场景中,您可能有一些请求和协议来查询(从客户端内部)一些状态变量(在服务器内部)。

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