C – exec是否必须在multithreading进程中立即执行fork?

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

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

假设我假设在由fork()创建的子进程和被exec()替换之间的时间内,子进程 – 作为父进程的副本 – 将具有父进程的所有线程,因此这些正确线程会运行 – 尽管只是很短的一段时间?

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

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

应使用单个线程创建进程。 如果multithreading进程调用fork() ,则新进程应包含调用线程的副本及其整个地址空间,可能包括互斥锁和其他资源的状态。 因此,为了避免错误,子进程可能只执行异步信号安全操作,直到调用其中一个exec函数为止。 可以通过pthread_atfork()函数建立fork处理程序,以便跨fork()调用维护应用程序不变量。

我相信这意味着你通常应该没问题,只要任何multithreading库正确使用pthread_atfork

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

预期的用法是prepare处理程序获取所有互斥锁,另外两个fork处理程序释放它们。

例如,应用程序可以提供一个准备例程,该例程获取库维护的必要互斥锁,并提供释放这些互斥锁的子例程和父例程,从而确保子项获得库的状态的一致快照(并且没有互斥体是左搁浅)。 或者,某些库可能只能提供一个子例程,它将库中的互斥锁和所有关联状态重新初始化为某个已知值(例如,最初执行映像时的状态)。

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

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

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