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

Sla*_*ish 10 c multithreading fork pthreads exec

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

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

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

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

Mat*_*hen 10

只有调用的线程fork将在新进程中运行.但是,您之前可以调用哪些功能是有限制的exec.来自fork:

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

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

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

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

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