在我在 Mac 上运行的 C/C++ 服务器应用程序(达尔文内核版本 10.4.0)中,我正在分叉子进程并希望这些子进程不继承服务器的文件句柄(文件、套接字、管道......)。似乎默认情况下所有句柄都被继承,甚至更多,netstat 显示子进程正在侦听服务器的端口。我怎么能做这样的叉子?
3 回答
Normally, after fork() but before exec() one does getrlimit(RLIMIT_NOFILE, fds); and then closes all file descriptors lower than fds.
Also, close-on-exec can be set on file descriptors using fcntl(), so that they get closed automatically on exec(). This, however, is not thread-safe because another thread can fork() after this thread opens a new file descriptor but before it sets close-on-exec flag.
On Linux this problem has been solved by adding O_CLOEXEC flag to functions like open() so that no extra call is required to set close-on-exec flag.
不,您需要自己关闭它们,因为只有您知道哪些需要保持打开状态。
Basically no. You have to do that yourself. Maybe pthread_atfork help, but it still be tedious.