在Linux下,句柄默认会被继承,这经常导致一些很难查的问题,可以通过fcntl函数禁止继承
if (fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC) == -1) { this->Close(); return false; }
较新的内核socket函数支持SOCK_CLOEXEC标志位(以及SOCK_NONBLOCK)
open函数也支持O_CLOEXEC标志位
在windows下可以用SetHandleInformation
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SetHandleInformation((HANDLE)sock, HANDLE_FLAG_INHERIT, 0);