父进程和派生子进程之间的文件描述符共享

4

我是网络编程的初学者。

我正在跟随Stevens的教程,实现可靠的UDP服务器。

我有一个问题。

当一个子进程被fork时,父进程的socket fd会发生什么?我读到说它们会被继承,这意味着父进程和子进程都有两个副本的socket fd?在子进程中,我们需要关闭继承的父进程socket fd吗?(Stevens的代码没有这样做)

如何在子进程中关闭父进程的fd(使用close()函数?),但不关闭客户端请求到达的socket(我应该保持它开放)?

如果我太幼稚了,请原谅我。

感谢您的帮助!

1个回答

1

文件描述符在fork时确实会被“继承”,但仅涉及到它们连接的套接字,如果关闭文件描述符,则仅在它是与该套接字(或文件,如果我们处理文件)相关联的最后一个时才会关闭套接字。

通常情况下,您需要建立套接字,然后进行fork。在父进程(fork返回非零值的进程)中,您可以使用close(fd)关闭文件描述符,否则您最终将在父进程中用尽文件描述符。这适用于流(例如TCP)套接字,其中有一个服务器套接字监听连接,并且每个已建立的连接都有一个套接字。但是,您正在使用UDP,因此实际上只有一个套接字,如果您打算在父进程中继续使用它,则需要找出如何在父子进程之间共享它。两者都可以继续使用它,但几乎随机地读取内容,并以任意顺序发送。在这种情况下,通常有一些多路复用过程,该过程接收数据包,并根据某些消息内容(在TCP中,它是源IP /端口和目标IP /端口元组)将其转发到适当的子进程(通过管道或其他套接字等其他机制)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接