如何正确使用 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 同时是 运行 的事实不会影响这一点。
我对如何正确关闭套接字文件描述符有疑问。假设服务器在接受新连接时派生另一个过程。原来的套接字文件描述符是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 同时是 运行 的事实不会影响这一点。