【发布时间】:2017-12-24 17:04:41
【问题描述】:
考虑这段代码:
socket_fd = start_server(port);
while (1){
new_socket_fd = accept_client(socket_fd);
int pid = fork();
if (pid == 0){
//I am the child server process
close(socket_fd); <------(1)
do_stuff_with_client(new_socket_fd, buffer);
close(new_socket_fd); <------(2)
exit(0);
} else if (pid > 0){
//I am the parent server process
close(new_socket_fd); <------(3)
} else {
fprintf(stderr, "Fork error\n");
return 1;
}
}
据我了解,当一个进程调用 fork() 时,它的地址空间是重复的,但不是共享的,所以如果我从子进程更改变量或关闭文件描述符,它不会影响父进程。
也就是说,在服务器接受新连接(从而创建new_socket_fd)后,它会分叉自己,并且子进程关闭socket_fd (1),因为它不是必需的,因为父进程仍在其socket_fd 上监听.
子进程处理请求,然后关闭其new_socket_fd (2) 并退出。
当子进程执行所有这些操作时,父进程已经关闭new_socket_fd (3),因为连接正在由子进程处理。
问题是:这些假设是否正确?
【问题讨论】:
-
是的。这看起来是正确的,而且推理是合理的。
-
@JonathanLeffler 嗯...快速提问 - 那么父进程何时/在哪里关闭
socket_fd? -
@JonathanLeffler 在孩子关闭
socket_fd之前绑定端口是否映射到两个 PID?如果有传入的数据包,它将被放入谁的队列? -
请注意,
listen()调用中的N参数是可以排队等待侦听进程的未完成连接数。即,尚未通过accept()调用返回值的连接请求数。在accept()接受连接后,对可以同时活动的连接数没有限制。 -
@AjayBrahmakshatriya:在孩子关闭 socket_fd 之前,绑定端口是否映射到两个 PID?如果有一个传入的数据包,它将被放入谁的队列中? 传入的数据包与套接字的“打开文件描述”(或等效的 - 与“文件描述符”或“套接字描述符”不同)相关联。它可供父母或孩子使用,以先阅读者为准。同样,传入的连接请求在
socket_fd上排队;他们可以被父母或孩子接受。但是,家人已经同意谁做什么,所以他们不会妨碍彼此。
标签: c sockets client-server fork tcpclient