如果在线程中调用fork,forked进程从哪里开始?

时间:2013-05-27 15:14:12

标签: c pthreads fork

我将编写一个程序,其中主线程创建新线程,然后新线程创建子进程。由于我很难跟踪新线程和分叉过程,我想从某人那里获得明智的答案。

我的问题是

  • 1。线程中创建的进程是否在pthread_create之后开始执行代码?
  • 2。如果不是1,如果在一个线程中调用fork,forked进程从哪里开始?

    感谢您阅读我的问题。

  • 1 个答案:

    答案 0 :(得分:0)

    其中一些是依赖于操作系统的,因为不同的系统具有不同的POSIX线程实现,这可能会暴露内部。

    POSIX提供pthread_atfork作为处理某些问题的一种有点直率的工具,但它对我来说仍然看起来很混乱。

    如果您的系统使用clonerfork在“用户域线程”和“内核线程”之间使用一对一映射来在线程之间实现正确的用户空间数据共享,那么fork只会复制调用它的(单个)线程。但是,如果您的系统具有多对多样式映射(以便一个用户进程处理多个线程,至少在它们进入阻塞系统调用之前),fork可能在内部复制多个线程。 POSIX说它应该看起来就像它只复制一个线程一样,所以不应该是可见的,但我不确定所有系统实现它的效果如何。

    http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them有一些一般的建议(以Linux为中心,很明显,但仍然有用)。

    您是否有某些特殊原因需要fork在线程中而不是exec?一般来说,如果你只想并行运行更多代码,你只需要剥离另一个线程(即,一旦你选择运行任何线程,你就可以在线程中做所有事情,除非你必须fork为{ {1}};如果exec失败,只需exec)。