我有关于如何正确关闭套接字文件描述符的问题.假设服务器在接受新连接时会分叉另一个过程.原始套接字文件描述符是sockfd和新的套接字文件描述符是new_sockfd.
sockfd = socket(...)
bind(...);
listen(...);
while(1) {
new_sockfd = accept(...);
if(fork() == 0) {
// Child process
dosomething(...);
}
else {
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我们应该把close(sockfd)和close(new_sockfd).我已经看到了网站的一些例子(http://www.tutorialspoint.com/unix_sockets/socket_quick_guide.htm "处理多个连接"),他们把close(sockfd)里面if块close(new_sockfd)的else块.但是,在fork之后,并不是两个并行运行的进程?如果父进程关闭new_sockfd,是否会影响子进程处理套接字?另外,如果子进程执行close(sockfd),这不会影响整个套接字程序吗?
dbu*_*ush 13
当进程分叉时,文件描述符在子进程中重复.但是,这些文件描述符彼此不同.关闭子项中的文件描述符不会影响父项中的相应文件描述符,反之亦然.
在你的情况下,由于子进程需要接受套接字new_sockfd和父进程继续使用监听套接字sockfd,孩子应该close(sockfd)(在你的if块;这并不影响母公司)和家长应close(new_sockfd)(在你的else块;这并未不会影响孩子.父母和孩子同时运行的事实不会影响这一点.