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