C语言 如何正确使用套筒收叉?

jckbn6z7  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一些关于如何正确关闭套接字文件描述符的问题。让我们假设服务器在接受新连接时派生另一个过程。原始套接字文件描述符是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,是否会影响子进程处理套接字?另外,如果子进程执行close(sockfd),是否会影响整个套接字程序?

qf9go6mv

qf9go6mv1#

当一个进程分叉时,文件描述符在子进程中被复制。但是,这些文件描述符彼此不同。关闭子进程中的文件描述符不会影响父进程中相应的文件描述符,反之亦然。
在您的例子中,由于子进程需要接受的套接字new_sockfd,而父进程继续使用侦听套接字sockfd,因此子进程应该使用close(sockfd)(在您的if块中;这不会影响父节点),父节点应该是close(new_sockfd)(在您的else块中;这不会影响子进程)。父进程和子进程同时运行的事实不会对此产生影响。

gcuhipw9

gcuhipw92#

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

相关问题