情况: 我有一个用C编写的多线程程序。如果其中一个线程分叉,子进程被另一个用exec()替换,父进程等待子进程退出。
问题: 在fork()创建子进程之后,有几行代码可以编译要在以下exec()命令中使用的参数。
假设 假设在由fork()创建的子进程和被exec()替换的子进程之间的时间,我是正确的,子进程 - 作为父进程的副本 - 将拥有父进程的所有线程,因此这些线程将会运行 - 虽然时间很短?
如果是这样,在fork()之后立即调用exec()的正确方法是什么?
答案 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