C - exec是否必须在多线程进程中立即跟随fork?

时间:2010-11-19 09:18:41

标签: c multithreading pthreads exec fork

情况: 我有一个用C编写的多线程程序。如果其中一个线程分叉,子进程被另一个用exec()替换,父进程等待子进程退出。

问题: 在fork()创建子进程之后,有几行代码可以编译要在以下exec()命令中使用的参数。

假设 假设在由fork()创建的子进程和被exec()替换的子进程之间的时间,我是正确的,子进程 - 作为父进程的副本 - 将拥有父进程的所有线程,因此这些线程将会运行 - 虽然时间很短?

如果是这样,在fork()之后立即调用exec()的正确方法是什么?

3 个答案:

答案 0 :(得分:10)

只有调用fork的线程才会在新进程中运行。但是,您可以在exec之前调用哪些函数。来自fork

  

应使用a创建流程   单线程。如果是多线程的   进程调用fork(),即新进程   应包含呼叫的复制品   线程及其整个地址空间,   可能包括的状态   互斥和其他资源。   因此,为了避免错误,   子进程可能只执行   异步信号安全操作直到   这个时间是exec函数之一   叫做。叉子   处理程序可以通过手段建立   的pthread_atfork()函数   为了维持申请   fork()次电话中的不变量。

我相信这意味着你通常应该没问题,只要有任何多线程  图书馆正确使用pthread_atfork

编辑:pthread_atfork页面进一步解释了图书馆如何保护自己:

  

预期用法是准备   handler获取所有互斥锁和   另外两个fork处理程序发布   它们。

     

例如,应用程序可以提供   获得的准备程序   必要的互斥图书馆   维护和供应儿童和父母   释放那些互斥体的例程,   从而确保孩子得到一个   一致的状态快照   图书馆(并没有互斥体   左搁浅)。或者,一些   图书馆也许能够提供   一个重新初始化的儿童例程   图书馆和所有的互斥体   关联状态与某些已知值   (例如,什么时候   图像最初被执行了。)

答案 1 :(得分:3)

正如@Matthew在他的回答中所写,父进程中的其他线程将不存在于子进程中(如果您使用的是PThreads)。

请注意,如果不是这样,那么在调用fork之后立即调用exec()会有所帮助,因为在调用exec之前,其他线程仍然可能会运行()。但是,您可以通过在调用fork()之前锁定互斥锁来控制它 - 它实际上会被对exec()的调用破坏。

答案 2 :(得分:0)

我也想过,所有的线程也会在子进程中被复制。但那不是真的。由于在子进程中没有复制其他线程,如果在exec之前使用互斥锁/锁,则需要确保编写fork处理程序以正确处理它们。 这是一篇关于它的文章。 http://learnwithtechies.com/tech/index.php?option=com_content&view=article&id=15:fork-in-multithreaded-environment&catid=10:unix