如何在不继承句柄的情况下分叉进程?

Mih*_*yan 3 c c++ posix fork

在我在Mac上运行的C/C++服务器应用程序(Darwin内核版本10.4.0)中,我正在分析子进程,并希望这些childes不会继承服务器的文件句柄(文件,套接字,管道......).似乎默认情况下所有句柄都被继承,netstat显示子进程正在侦听服务器的端口.我该怎么做这种叉子?

Max*_*kin 9

通常情况下,后fork()而前exec()一个做getrlimit(RLIMIT_NOFILE, fds);,然后关闭所有文件描述符低于fds.

此外,close-on-exec可以使用文件描述符设置fcntl(),以便自动关闭exec().但是,这不是线程安全的,因为另一个线程可以fork()在此线程打开新文件描述符之后但在它设置close-on-exec标志之前.

在Linux上,这个问题已经通过向O_CLOEXEC函数添加标志来解决,open()因此不需要额外的调用来设置close-on-exec标志.