【问题标题】:File Descriptor Sharing between Parent and forked Children父子和分叉子之间的文件描述符共享
【发布时间】:2010-10-17 07:12:05
【问题描述】:

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

我跟随 stevens 并可靠地实施 UDP 服务器。

我有一个问题。

当一个孩子被分叉时,孩子的父套接字 fd 会发生什么......?我读到他们被继承了,这意味着我们在父母和孩子中有两个套接字 fd 副本??我们是否需要在子进程中关闭继承的父套接字 fd(史蒂文斯代码不这样做)

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

如果我太天真了..请原谅我。

感谢您的帮助!!

【问题讨论】:

    标签: c sockets unix network-programming


    【解决方案1】:

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

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

    正如马特所指出的,使用shutdown 实际上会使所有相关的套接字都无法使用(通常是不可写的,但您可以指定这一点)。在 TCP 中,这可能会触发 FIN 数据包的发送,从而有效地启动断开连接,但在远程端确认 FIN 之前,您仍然能够接收数据。

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2013-02-26
      • 2011-03-11
      • 2011-10-02
      相关资源
      最近更新 更多