父母和分叉儿童之间的文件描述符共享

时间:2010-10-17 07:12:06

标签: c sockets unix network-programming

我是网络编程的初学者。

我遵循stevens并可靠地实施UDP服务器。

我有一个问题。

当孩子分叉时,孩子的父插座fd会发生什么...?我读到他们得到了继承,这意味着我们在父母和孩子中有两个套接字fd副本?我们是否需要在子节点中关闭继承的父套接字fd(stevens代码不会这样做)

如何在子节点中关闭父节点fds(使用close()??)而不是客户机请求到达的套接字(我应该保持打开状态)?

如果我天真。请原谅。

感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

文件描述符在分叉时确实是'继承的',但仅限于它们连接到的套接字,关闭文件描述符只会关闭套接字,如果它是与该套接字关联的最后一个(或文件,如果我们正在处理文件。)

你通常做的是建立套接字,然后你分叉。在父进程(fork返回非零)的过程中,您可以继续使用close(fd)关闭文件描述符,如果不这样做,您最终将在父进程中耗尽文件描述符。这适用于流(例如TCP)套接字,其中有一个服务器套接字侦听连接,每个已建立连接有一个套接字。但是,您使用的是UDP,因此实际上只有一个套接字,如果您打算在父进程中继续使用它,则需要弄清楚如何在父进程和子进程之间共享它。两者都可以继续使用它,但它几乎是随机的,它会读取内容以及发送内容的顺序。在这种情况下,您通常会有某种多路复用过程,它接收数据包,并根据某些消息内容将它们转发给适当的子进程(根据某些其他机制,例如管道或其他套接字)(在TCP中,它是源ip / port和destination ip / port tuple)。

Matt指出,使用shutdown实际上会使所有涉及的套接字无法使用(通常是不可写的,但你可以指定它)。在TCP中,这可以触发FIN数据包的发送,有效地启动连接的拆除,但是在远程端确认FIN之前,您仍然能够接收数据。