Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果在线程中调用fork,那么forked进程从何处开始?_C_Pthreads_Fork - Fatal编程技术网

C 如果在线程中调用fork,那么forked进程从何处开始?

C 如果在线程中调用fork,那么forked进程从何处开始?,c,pthreads,fork,C,Pthreads,Fork,我将编写一个程序,其中主线程创建一个新线程,然后新线程创建一个子进程。因为我很难跟踪新线程和分叉过程,所以我想从某人那里得到一个明智的答案 我的问题是 1。线程中创建的进程是否在pthread\u create之后开始执行代码? 二,。如果1不是,那么当线程中发生fork调用时,fork进程从何处开始 感谢您阅读我的问题。有些问题有点依赖操作系统,因为不同的系统有不同的POSIX线程实现,这可能会暴露内部 POSIX提供了pthread_atfork作为处理某些问题的一种有点生硬的工具,但在我看

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

我的问题是

  • 1。线程中创建的进程是否在
    pthread\u create
    之后开始执行代码?
  • 二,。如果1不是,那么当线程中发生fork调用时,fork进程从何处开始


    感谢您阅读我的问题。

    有些问题有点依赖操作系统,因为不同的系统有不同的POSIX线程实现,这可能会暴露内部

    POSIX提供了
    pthread_atfork
    作为处理某些问题的一种有点生硬的工具,但在我看来它仍然相当混乱

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

    这里有一些一般性的建议(显然是以Linux为中心的,但仍然有用)


    是否有某种特定的原因使您希望在线程内部执行
    fork
    ,而不是
    exec
    ?一般来说,如果您只想并行运行更多代码,您只需剥离另一个线程(即,一旦您选择运行任何线程,您就可以在线程中执行所有操作,除非您必须为
    exec
    分叉
    ;如果
    exec
    失败,只需
    \u exit
    )。

    分叉只克隆调用线程,如果这就是你要问的。那么,如果分叉进程中的线程例程完成,线程中的分叉进程会消亡吗?我想你要问的是调用fork而不是exec的情况,而新进程中的线程例程会退出吗?我假设在这种情况下它会退出,但我不确定。从thread start函数返回相当于
    pthread_exit
    ,并且由于
    pthread_exit
    不是异步信号安全的,因此在多线程程序中在
    fork
    之后调用它会调用未定义的行为。是的,假设调用fork而不是exec,以及进程出口中的线程启动函数。有人帮我…这只是个家庭作业。我也不想在线程内调用
    fork
    。有什么方法可以检查一个进程有多少线程吗?没有,请参阅我使用了
    prtstat-r[pid]
    命令来检查由
    pid
    指定的进程有多少线程。
    prstat
    似乎是一个特定于Solaris的命令;它在MacOS和FreeBSD上不存在
    prtstat
    似乎类似于特定于Linux。因此,有特定于操作系统的方法,但没有通用的pthread库。