4

Mac (Darwin Kernel Version 10.4.0) で動作する私の C/C++ サーバー アプリケーションでは、子プロセスをフォークしており、これらの子がサーバーのファイル ハンドル (ファイル、ソケット、パイプなど) を継承しないようにします。デフォルトでは、すべてのハンドルが継承されているようです。さらに、netstat は、子プロセスがサーバーのポートをリッスンしていることを示しています。どうすればそのようなフォークを行うことができますか?

4

3 に答える 3

11

通常、fork()より低いすべてのファイル記述子を閉じてから閉じexec()ます。getrlimit(RLIMIT_NOFILE, fds);fds

また、close-on-execを使用してファイル記述子に設定できるfcntl()ため、 で自動的に閉じられますexec()。ただし、これはスレッドセーフではありません。これは、fork()このスレッドが新しいファイル記述子を開いた後、close-on-execフラグを設定する前に別のスレッドができるためです。

Linux では、フラグを設定するために追加の呼び出しが必要ないO_CLOEXECように、関数にフラグを追加することでこの問題が解決されました。open()close-on-exec

于 2012-10-24T16:15:09.987 に答える
2

いいえ、開いたままにする必要があるかどうかを知っているのは自分だけなので、自分で閉じる必要があります。

于 2012-10-24T16:10:38.163 に答える
0

基本的にいいえ。あなたはそれを自分でしなければなりません。役立つかもしれませpthread_atforkんが、それでも面倒です。

于 2012-10-24T16:13:44.870 に答える