19-在accept()中继承标记和选项
61.11 在accept()中继承标记和选项
多种标记和设定都可以同打开的文件描述和文件描述符(见5.4节)相关联起来。此外,如61.9节所述,我们可以为套接字设定多个选项。如果将这些标记和选项设定在监听套接字上,它们会通过由accept()返回的新套接字所继承吗?本节我们将描述其中的细节。
在Linux上,如下这些属性是不会被accept()返回的新的文件描述符所继承的。
- 同打开的文件描述相关的状态标记——即,可以通过fcntl()的F_SETFL(见5.3节)操作所修改的标记。这些标记包括O_NONBLOCK和O_ASYNC。
- 文件描述符标记——可以通过fcntl()的F_SETFD操作来修改的标记。唯一一个这样的标记是执行中关闭(close-on-exec)标记(FD_CLOEXEC,27.4节中有描述)。
- 与信号驱动I/O(见63.3节)相关联的文件描述符属性,如 fcntl()的F_SETOWN(属主进程ID)以及F_SETSIG(生成信号)操作。
换句话说,由 accept()返回的新的描述符继承了大部分套接字选项,这些选项可以通过setsockopt()来设定(见61.9节)。
本节描述的一些细节在SUSv3中并没有规定,有关 accept()返回的新的连接套接字的继承规则在不同的UNIX实现中也有所区别。最需要注意的是,在一些UNIX实现中,如果打开的文件状态标记如O_NONBLOCK和O_ASYNC设定在了监听套接字上,那么它们会被accept()返回的新的套接字所继承。为了满足可移植性,可能需要显式地在accept()返回的新套接字上重新设定这些属性。