如何正确使用 socket close for fork?

How to correctly use socket close for fork?

我对如何正确关闭套接字文件描述符有疑问。假设服务器在接受新连接时派生另一个过程。原来的套接字文件描述符是sockfd,新的套接字文件描述符是new_sockfd.

sockfd = socket(...)
bind(...);
listen(...);

while(1) {
  new_sockfd = accept(...);
  if(fork() == 0) {
    // Child process
    dosomething(...);

  }
  else {

  }
}

我的问题是,我们应该把 close(sockfd)close(new_sockfd) 放在哪里。我在网站 (http://www.tutorialspoint.com/unix_sockets/socket_quick_guide.htm "Handle Multiple Connection") 中看到了一些示例,它们将 close(sockfd) 放在 if 块中,将 close(new_sockfd) 放在 else 块中。但是,fork之后,这两个进程运行不是并行的吗?如果父进程关闭new_sockfd,会不会影响子进程处理socket?还有,如果子进程执行close(sockfd),会不会影响到整个socket程序?

父进程应该关闭接受的套接字(在 else 块中):它在子进程中保持打开状态,直到子进程完成它,此时它应该发出自己的关闭。

当进程分叉时,文件描述符会在 child 进程中复制。但是,这些文件描述符彼此不同。关闭 child 中的文件描述符不会影响 parent 中相应的文件描述符,反之亦然。

在你的例子中,由于 child 进程需要接受套接字 new_sockfd 而 parent 进程继续使用监听套接字 sockfd,child 应该 close(sockfd) (在你的 if 块中;这不会影响 parent)并且 parent 应该 close(new_sockfd) (在你的 else 块;这不会影响 child)。 parent 和 child 同时是 运行 的事实不会影响这一点。