【发布时间】:2018-01-21 16:32:24
【问题描述】:
pid_t pid;
int listenfd, connfd;
listenfd = socket(...);
bind(listenfd, ...);
listen(listenfd, 5);
connfd = accept(listenfd, ...);
if ((pid = fork()) == 0){
close(listenfd);
doit(connfd); /* processes the clients request*/
close(connfd);
exit(0);
}
wait(...)
调用等待函数后,我会有多少个 TCP 连接? 我认为它应该是 0,但我真的不知道 close() 函数的作用。它是关闭每个进程还是只关闭一个进程(子进程或父进程)? 谢谢!
【问题讨论】:
-
据我所知,在 fork 之后,所有打开的文件描述符都没有
O_CLOEXEC标志将被复制并出现在父进程和子进程中,并且每个进程都需要分别关闭他的描述符。也就是说,在 fork 之后,您最终会在每个进程中得到 4 个描述符 -listenfd和connfd。每个进程都需要关闭它们。 -
是的,但是 4 个文件描述符不等于 4 个 TCP 连接,对吧?
-
所以在
wait线TCP连接仍然由服务器持有。因为它还没有关闭连接套接字。 -
在您不显示的代码中
connfd的任何副本是否涉及对shutdown()的调用? -
我想不会。这是来自考试的,你所拥有的只是这段代码和问题。没有别的了。
标签: c linux sockets networking tcp