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

时间:2012-10-24 16:07:42

标签: c++ c posix fork

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

3 个答案:

答案 0 :(得分:9)

通常,在fork()之后exec()之前getrlimit(RLIMIT_NOFILE, fds);执行fds,然后关闭低于close-on-exec的所有文件描述符。

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

在Linux上,通过向open()等函数添加close-on-exec标志已解决此问题,因此无需额外调用来设置{{1}}标志。

答案 1 :(得分:1)

不,你需要自己关闭它们,因为只有你知道你需要保持打开与否。

答案 2 :(得分:0)

基本上没有。你必须自己做。也许pthread_atfork有帮助,但它仍然很乏味。