Network.Socket示例中的"withFdSocket sock setCloseOnExecIfNe



在Network.Socket包中,有一个echo服务器示例。在echo服务器中,在实际绑定到套接字之前,会调用withFdSocket sock setCloseOnExecIfNeeded。相关功能如下:

open :: AddrInfo -> IO Socket
open addr = E.bracketOnError (openSocket addr) close $ sock -> do
setSocketOption sock ReuseAddr 1
withFdSocket sock setCloseOnExecIfNeeded
bind sock $ addrAddress addr
listen sock 1024
return sock

完整的示例可以在Network.Socket包文档中找到。

这次通话的目的是什么?据我所知,withFdSocket创建了一个与套接字相关联的文件描述符,setCloseOnExecIfNeeded在描述符上设置CLOEXEC标志。然而,这个描述符会立即被"丢弃",并且不会对其进行任何处理

我是否感到困惑的是,文件描述符总是存在,而withFdSocket只是提供了这个现有的描述符,我们必须用标志更新它,以便在程序退出时关闭套接字?

withFdSocket不创建Fd;它只是读取已经存储在套接字数据结构中的那个。

最新更新