微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我是网络编程的初学者..

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

我有个问题.

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

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

如果我天真…请原谅.

谢谢您的帮助 !!

解决方法

文件描述符的确是“继承”分叉的时候,但仅就他们在做什么插座连接,并关闭文件描述符只会关闭套接字,如果是与插座(或文件相关联的最后一个,如果我们处理文件).

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐