fork和现有线程?

时间:2009-07-02 11:57:33

标签: c multithreading unix fork

在Linux系统上,子进程是否以与父进程相同的方式查看现有线程?

int main() {

  //create thread 1

  int child_pid = fork();

  if ( 0 == child_pid)
  {
       ..
  }
  else
  {
       ..
  }

由于为子进程复制了整个地址空间,因此线程的状态会发生什么。如果上段中的线程1正在等待条件信号,该怎么办?是否在儿童过程中处于等待状态?

2 个答案:

答案 0 :(得分:15)

现在linux上的线程试图保持posix complient。只复制调用线程,而不是其他线程(注意,例如在solaris上你可以选择fork做什么,具体取决于你链接到哪个库)

来自http://www.opengroup.org/onlinepubs/000095399/functions/fork.html

  

应使用a创建流程   单线程。如果是多线程的   进程调用fork(),新进程   应包含呼叫的复制品   线程及其整个地址空间,   可能包括的状态   互斥和其他资源。   因此,为了避免错误,   子进程可能只执行   异步信号安全操作直到   这样的时间作为执行功能之一   叫做。叉子   处理程序可以通过手段建立   的pthread_atfork()函数   为了维持申请   fork()调用的不变量。

答案 1 :(得分:0)

使用fork()不会从Linux系统上的子进程继承线程。这里有一个深入的来源:http://linas.org/linux/threads-faq.html