【发布时间】:2012-11-06 19:28:40
【问题描述】:
我想将新功能添加到已扩展的应用程序中,以使用 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 生成新进程时,处理共享内存和共享信号量的正确方法是什么?
【问题讨论】:
标签: c multithreading exec fork shared