我有一些关于如何正确关闭套接字文件描述符的问题。让我们假设服务器在接受新连接时派生另一个过程。原始套接字文件描述符是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)
,是否会影响整个套接字程序?
2条答案
按热度按时间qf9go6mv1#
当一个进程分叉时,文件描述符在子进程中被复制。但是,这些文件描述符彼此不同。关闭子进程中的文件描述符不会影响父进程中相应的文件描述符,反之亦然。
在您的例子中,由于子进程需要接受的套接字
new_sockfd
,而父进程继续使用侦听套接字sockfd
,因此子进程应该使用close(sockfd)
(在您的if
块中;这不会影响父节点),父节点应该是close(new_sockfd)
(在您的else
块中;这不会影响子进程)。父进程和子进程同时运行的事实不会对此产生影响。gcuhipw92#
父进程应该关闭接受的套接字(在
else
块中):它在子进程中保持打开状态,直到子进程处理完它,此时它应该发出自己的关闭。