我想将新功能添加到一个成长的应用程序中,以使用 fork (2) 和 exec (3) (当前为 execl) 开始执行另一个应用程序。
不幸的是,该应用程序使用共享内存、共享信号量并且有大量打开的文件描述符,在调用 fork 时这些描述符都是重复的。我知道我应该在子进程中调用 execl 之前关闭所有文件描述符、共享资源等,但是其中一部分由第三方库处理,我无法访问它们。
最重要的是,所有应用程序都是线程化的(使用 posix 线程),但只要子进程中的 fork 和 exec 之间没有异步系统调用(根据http://www.linuxprogrammingblog.com/threads -and-fork-think-twice-before-using-them )。
我现在面临的问题是 execl 调用似乎以某种方式破坏了共享资源,导致使用它们的线程出现死锁。这似乎只在调用 execl 时发生,因为在使用 _exit (2) 的 fork 后立即退出子进程不会产生这种行为。
使用 fork 和 exec 生成新进程时,处理共享内存和共享信号量的正确方法是什么?