在我的C/C++服务器应用程序中,它运行于Mac操作系统(Darwin Kernel Version 10.4.0),我要分叉子进程,并希望这些子进程不继承服务器的文件句柄(文件、套接字、管道等)。似乎默认情况下所有句柄都会被继承,甚至netstat显示子进程正在侦听服务器的端口。如何进行此类分叉操作?
exec()
之前,需要先调用fork()
,并使用getrlimit(RLIMIT_NOFILE, fds);
获取文件描述符的数量,然后关闭所有低于fds
的文件描述符。
此外,可以通过使用fcntl()
在文件描述符上设置close-on-exec
,以使它们在exec()
时自动关闭。但是,这种方式不是线程安全的,因为另一个线程可能会在该线程打开新文件描述符后但在设置close-on-exec
标志之前调用fork()
。
在Linux上,通过向open()
等函数添加O_CLOEXEC
标志来解决了这个问题,因此不需要额外的调用来设置close-on-exec
标志。
exec
,你可以配置所有的FDs为“在执行时关闭”。但是我认为OP不打算执行任何东西... - Kerrek SBfor (i=0; i < 1024; ++i) close(i);
这个方法,或者如果你有很多连接的话,可以选择更高的数字。 (或者最好像 @Maxim 一样使用 getrlimit(RLIMIT_NOFILE, fds);
来获取你可以拥有的最高 fd) - hexist
fork()
之后执行exec()
,也许这个答案会对你有所帮助:https://dev59.com/z3I-5IYBdhLWcg3w18Z3#1644590 - Olaf Dietsche