在 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回避。
我正在实现一个为多个客户端提供服务的服务器,我需要将一些服务器的变量放在共享内存中,以便客户端实际看到另一个客户端最终编辑的内容。
我试着环顾四周,但我不明白是否有任何方法可以通过使用 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回避。