成長したアプリケーションに、fork(2)とexec(3)(現在はexecl)を使って別のアプリケーションの実行を開始する新機能を追加したいと考えています。
残念ながら、アプリケーションは共有メモリ、共有セマフォを使用し、膨大な数の開いているファイル記述子を持っています。これらは fork を呼び出すときにすべて複製されます。子プロセスで execl を呼び出す前に、すべてのファイル記述子、共有リソースなどを閉じる必要があることはわかっていますが、これらの一部はサードパーティのライブラリによって処理され、アクセスする手段がありません。
さらに、アプリケーションはすべてスレッド化されています (posix スレッドを使用) が、子プロセスの fork と exec の間に非同期システム コールがない限り問題ありません ( http://www.linuxprogrammingblog.com/threadsによると)。 -and-fork-think-twice-before-using-them )。
私が今直面している問題は、execl 呼び出しが何らかの形で共有リソースを破損しているように見え、それらを使用するスレッドでデッドロックが発生することです。これは、_exit (2) を使用して fork した直後に子プロセスを終了するように execl を呼び出しても、この動作が発生しない場合にのみ発生するようです。
fork と exec で新しいプロセスを生成するときに、共有メモリと共有セマフォを処理する適切な方法は何ですか?